我试着声明:
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>>
处理异步函数,但再次-没有参数,只返回值)。通常,您还需要从"另一种类型"中读取值。所以你有以下选项:
-
提供无参数委托(尽管在这种具体情况下没有多大意义):
static Task<T> ReadAsync<T>(Func<T> read) => Task.Run(read);
使用
ReadAsync(() => myValueHolder.GetValue())
-
使用2个泛型参数,并为第一个提供实例(也可以创建扩展方法):
static Task<TResult> ReadAsync<T, TResult>(T valueHolder, Func<T, TResult> read) => Task.Run(() => read(valueHolder));
-
如果您的
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。