提问人:Nevir 提问时间:4/6/2023 最后编辑:Theodor ZouliasNevir 更新时间:4/7/2023 访问量:80
使用委托 Func<T,T 的异步声明>
Asynchronous declaration with delegate Func<T,T>
问:
我试着声明这一点:
public static async Task<T> ReadAsync<T>(Func<T,T> read)
{
return await Task.Run(read);
}
我有一个错误:
参数 1:无法从“System.Func<T, T>”转换为“System.Action”
我无法修复它。 我尝试过这个,但也有一个错误:“T”是一种类型,在给定的上下文中无效。
public static async Task<T> ReadAsync<T>(Func<T,T> read)
{
return await Task.Run(read(T));
}
答:
2赞
Guru Stron
4/6/2023
#1
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));
如果你的方法有 valueHolder 可用 - 删除第一个参数,尽管用法需要传递两个泛型参数:
ReadAsync
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())
笔记:
- 在某些情况下,可以跳过 - 阅读有关 Eliding Async 和 Await 的更多信息。
async-await
- Task.Run 礼仪示例:不要在实现中使用 Task.Run。
评论
ReadAsync
ReadAsync