gpt4 book ai didi

c# - 为什么分配异步等待事件处理程序不会导致任何问题?

转载 作者:行者123 更新时间:2023-12-04 03:50:25 24 4
gpt4 key购买 nike

给定以下代码:

delegate void TestEventHandler();

event TestEventHandler TestEvent;

void Main()
{
TestEvent += () => Console.WriteLine("Sync");

TestEvent += async () => await AsyncHandler();

TestEvent();
}

private async Task<int> AsyncHandler()
{
await Task.Delay(200);
Console.WriteLine("Async");

return 5;
}

我想知道为什么这不会造成任何问题。 async () => await AsyncHandler() 不返回任务吗?在此示例中,它可分配给返回 void 的委托(delegate)?

此外,这会导致任何问题吗?使偶数处理程序异步......那么容易吗?我想知道在这种情况下可能会在哪里捕获到潜在的异常。

为了比较,上面示例中的以下代码:

var tasks = Enumerable.Range(0, 5).Select(async _ => await AsyncHandler());

await Task.WhenAll(tasks);

如预期的那样,这会生成 Task 的集合。那么为什么它现在是一个 Task,但在它上面算作 void?

最佳答案

在这段代码中:

TestEvent += async () => await AsyncHandler();

...编译器正在推断 lambda 表达式的类型。它推断出与委托(delegate)匹配的类型。它或多或少与这样做相同:

var action = new Action(async () => await AsyncHandler());  //<-- not a Func<Task>!
TestEvent += action;

您会注意到您没有为事件分配功能,而是为 Action 分配。

如果您想知道如何从一个函数中推断出一个 Action ,请参阅 Why can lambdas convert function calls into actions? .

关于c# - 为什么分配异步等待事件处理程序不会导致任何问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64488202/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com