具有委托 Func<T,T> 的异步声明



我试着声明:

public static async Task<T> ReadAsync<T>(Func<T,T> read)
{
return await Task.Run(read);
}

和我有错误:

参数1:不能从'System. func<T,>'转换为'System. func<'行动">

我不能修理它。我尝试了这个,也有一个错误:'T'是一个类型,这在给定的上下文中是无效的

public static async Task<T> ReadAsync<T>(Func<T,T> read)
{
return await Task.Run(read(T));
}

Func<T,TResult>是代表接受T类型的单参数返回TResult的函数的委托,因此Func<T, T>是接受单参数返回相同类型的值的函数,Func<int, int> myFunc = i => i + 1;可以是一个很好的例子。

Task.Run有几个重载,它们都没有委托接受参数,它要么是Action委托(不接受参数,不返回任何东西)或Func<TResult>(或Func<Task<TResult>>处理异步函数,但再次-没有参数,只返回值)。通常,您还需要从"另一种类型"中读取值。所以你有以下选项:

  1. 提供无参数委托(尽管在这种具体情况下没有多大意义):

    static Task<T> ReadAsync<T>(Func<T> read) => Task.Run(read);
    

    使用ReadAsync(() => myValueHolder.GetValue())

  2. 使用2个泛型参数,并为第一个提供实例(也可以创建扩展方法):

    static Task<TResult> ReadAsync<T, TResult>(T valueHolder, Func<T, TResult> read) 
    => Task.Run(() => read(valueHolder));
    
  3. 如果您的ReadAsync方法有valueHolder可用-删除第一个参数,尽管使用将需要传递两个泛型参数:

    static async Task<TResult> ReadAsync<T, TResult>(Func<T, TResult> read)
    {
    T valueHolder = ...;
    return await Task.Run(() => read(valueHolder));
    }
    

    和用法ReadAsync<SomeType, SomeResult>(t => t.GetValue())

指出:

  • 在某些情况下可以跳过async-await-阅读更多关于省略Async和Await。
  • 任务。运行礼仪示例:不要使用Task。

相关内容

  • 没有找到相关文章

最新更新