问题描述
在的一些C#5的异步的陷阱的博客文章读/等待。它提到在疑难杂症#4的东西是相当深刻,而且我从来没有想到过的。
简而言之,它涵盖了,你必须有两个重载的方法,一种采用了动作
和一个带有一个 Func键和LT的场景;任务>
(例如 Task.Run
)。这个问题的根源在于论点,即异步无效
方法应仅用于事件处理程序,与当时的帖子怎么回事描绘以下场景 - 这是什么编译器推断时像下面这样的lambda函数可以被编译到A Func键<任务>
和动作
:
Task.Run(异步()=> {
等待Task.Delay(1000);
});
由于 Task.Run
的 Task.Run(Func键<任务>)两个签名
和 Task.Run(动作)
,是什么类型的异步匿名函数编译成?一个异步无效
或 Func键<任务>
?我的直觉说,这将编译下降到异步无效
纯粹是因为它是一个非泛型类型,不过C#编译器可能是聪明的,并给 Func键<任务>
类型preference
此外,有没有一种方法来明确声明其过载我希望用?我知道我可以只创建一个新的实例 Func键<任务>
和异步lambda函数传递有,但它仍然编译降到异步无效
,然后传递到 Func键&LT的构造;任务>
。什么是确保理想的途径其编译为 Func键<任务>
我只是检查它被编译成 Task.Run(Func键<任务>)默认
,我没有很好的解释这一点。
下面为IL的相关部分
IL_0001:ldsfld UserQuery.CS $<> 9__CachedAnonymousMethodDelegate1
IL_0006:brtrue.s IL_001B
IL_0008:ldnull
IL_0009:ldftn UserQuery<主> b__0
IL_000F:newobj System.Func< System.Threading.Tasks.Task> ..男星//< - 注意,在这里
IL_0014:stsfld UserQuery.CS $<> 9__CachedAnonymousMethodDelegate1
IL_0019:br.s IL_001B
IL_001B:ldsfld UserQuery.CS $<> 9__CachedAnonymousMethodDelegate1
IL_0020:拨打System.Threading.Tasks.Task.Run
您可以检查这一点很容易使用Visual Studio的类型推断,它会告诉你它会被编译什么方法,如果你只需将鼠标悬停的方法,或点击方法preSS F12 骨节病>你可以看到它的元数据会告诉你什么是由编译器推断类型。
Task.Run(new Action(async () =>
{
await Task.Delay(1000);
}));
Task.Run(new Func<Task>(async () =>
{
await Task.Delay(1000);
}));
这篇关于明确使用函数求&LT;任务&GT;异步lambda函数时动作过载可用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!