本文介绍了明确使用函数求<任务>异步lambda函数时动作过载可用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在的一些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函数时动作过载可用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-24 10:48