首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从无到有异步处理

从无到有异步处理
EN

Stack Overflow用户
提问于 2015-01-08 17:03:02
回答 1查看 196关注 0票数 2

我有以下课程,名为Pluck:

代码语言:javascript
复制
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;  }

我的主要方法是:

代码语言:javascript
复制
static void Main(string[] args)
{
    Pluck.Work(); 
}

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-08 17:13:15

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

这导致用async关键字标记async,并让它返回Task本身:

代码语言:javascript
复制
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同步等待

代码语言:javascript
复制
static void Main(string[] args)
{
    Pluck.WorkAsync().Wait(); 
}

在单个await是在方法中所做的最后一件事的情况下(就像在SumAsync和my WorkAsync中一样),您可以删除它和async关键字,然后直接返回任务。这个稍微提高了的性能。更多关于它的here

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27845604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档