从头开始异步处理

时间:2015-01-08 17:03:02

标签: c# .net multithreading async-await

我有以下类名为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内切换断点并且永远不会被击中。

1 个答案:

答案 0 :(得分:3)

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

这导致使用Work关键字标记async,并让它自己返回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);
}

由于您无法在await中使用Main,因此您需要与Wait同步等待:

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

如果单个await是您在方法中执行的最后操作(例如在SumAsync和我的WorkAsync中),则可以将其删除async关键字,只需返回任务。 略微可提高性能。关于它的更多信息here


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