gpt4 book ai didi

c# - 从头开始异步处理

转载 作者:行者123 更新时间:2023-11-30 22:01:16 25 4
gpt4 key购买 nike

我有以下名为 Pluck 的类:

internal static void Work()
{
Task[] tasks = new Task[5];
for (int i = 0; i < tasks.Length; i++)
{
tasks[i] = SumAsync();
}
Task.WhenAll(tasks);
}

private static async Task<int> SumAsync()
{
return await Task.Run(() => { return OnePlusOne(); });
}

private static int OnePlusOne()
{ return 1+1; }

还有我的主要方法:

static void Main(string[] args)
{
Pluck.Work();
}

我遗漏了一些东西,因为我在 OnePlusOne 中切换了一个断点,但从未被击中。

最佳答案

Task.WhenAll(tasks) 是一个 async 方法,因此返回一个 Task。您需要 await 该任务以确保您仅在所有任务完成后才继续。目前,您的应用程序可能会在这些任务有机会运行之前结束。

这导致使用 async 关键字标记 Work 并让它返回一个 Task 本身:

internal static async Task WorkAsync()
{
Task[] tasks = new Task[5];
for (int i = 0; i < tasks.Length; i++)
{
tasks[i] = SumAsync();
}
await Task.WhenAll(tasks);
}

因为你不能在 Main 中使用 await 你需要用 Wait 同步等待:

static void Main(string[] args)
{
Pluck.WorkAsync().Wait();
}

如果单个 await 是您在方法中执行的最后一件事(如在您的 SumAsync 和我的 WorkAsync 中),您可以删除它和 async 关键字并简单地返回任务。这略微提高了性能。更多信息 here .


注意:您应该只在非常特殊的情况下(比如在 Main 内)使用 Wait 阻塞任务,因为它可能导致死锁。更好的解决方案是使用 AsyncContext .

关于c# - 从头开始异步处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27845604/

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