【发布时间】:2021-08-13 19:56:06
【问题描述】:
我很难弄清楚如何在 C# 中“存储”和调用异步 lambda,它基本上是通过运行来尝试的。我发现了一些可行的方法,而另一些则不可行(见下文),我读过它,但仍然不清楚为什么有些可行而有些不可行,有人可以解释为什么并添加更好的方法吗?
public static class Program
{
static async Task Main(string[] args)
{
// works fine, everything is printed
Console.WriteLine("Before 1 delay");
await Task.Delay(1000);
Console.WriteLine("After 1 delay");
// works fine, everything is printed
var foo = new Func<Task>(async () =>
{
Console.WriteLine("Before 2 delay");
await Task.Delay(1000);
Console.WriteLine("After 2 delay");
});
await foo.Invoke();
// works fine, everything is printed
var foo2 = new Action(() =>
{
Console.WriteLine("Before 3 delay");
Task.Delay(1000).Wait();
Console.WriteLine("After 3 delay");
});
foo2.Invoke();
// Does not work, just before is printed
var foo3 = new Action(async () =>
{
Console.WriteLine("Before 4 delay");
await Task.Delay(1000);
Console.WriteLine("After 4 delay");
});
foo3.Invoke();
}
}
请注意,这个问题与下面的问题不同,即使答案相同,上下文也不同,因为这个问题基本上是为什么 Action 委托确实运行异步,即使等待在那里,除了有“为什么 .Await() 有效,而 await 不要在动作委托中”的“奖励”
异步任务与异步无效 “await” 不等待调用完成 为什么控制台窗口在显示我的输出后立即关闭? 如何阻止 C# 控制台应用程序自动关闭?
【问题讨论】:
-
我很好奇为什么你会首先将
Func/Action分配给一个变量,而不是内联使用它们并让类型推断来完成它的工作。在您当前的状态下,您不妨将它们定义为类上的静态函数或使用本地函数。 -
在
foo3.Invoke();之后放置一个“Console.ReadKey()” -> 看看会发生什么。 -
实际上我的 Ide 抱怨说无法推断,我不确定在 foo 的情况下推断是否可以在这里工作......
-
@Andre: Here you go.
标签: c# asynchronous lambda async-await task