繁体   English   中英

Console程序中的任务和异步

[英]Task and asynchronous in Console program

我刚刚阅读了控制台项目中的特殊情况。 你能告诉我我的做法是否正确吗? 那里有两个工作我不确定我是否应该像在这里一样使用等待在Task.Run中,如果它是正确的你可以解释如果我从这里删除两个等待会有什么不同。 接下来的问题如果我将从WhenAny删除.Wait()。 一般来说它是控制台应用程序的正确方法 忘记提出异步Main到目前为止,让我们谈谈void。

public class Program
{
  public static void Main()
  {
     //jobs can work in parael not blocking program
     var job0 = Task.Run(async () => await new DoThisAsync().Run());
     var job1 = Task.Run(async () => await new DoThatAsync().Run());

     //Any Independent synchronous work can run meantime jobs
     IndependentSynchronousMethod;

     //We wait on tasks
     Task.WhenAll(job0, job1).Wait();
  }

}

大部分代码都不需要

此外,如果您使Main async您可以执行以下操作

public static async Task Main()
{
    var job0 = DoThisAsync();
    var job1 = DoThatAsync();

    //Any Independent synchronous work can run meantime jobs
    IndependentSynchronousMethod;

    //We wait on tasks
    await Task.WhenAll(job0, job1)
}

使您的主要异步

Project -> Build -> Advanced - Language Version >= 7.1

其他资源

Task.WhenAll方法

创建将在所有提供的任务完成后完成的任务。

无法在控制台应用程序的“Main”方法上指定“async”修饰符

更新

Arie:要清楚地忘记Async Main

没有异步签名,您可以在控制台应用程序中执行此操作。

Task.WhenAll(job0, job1).Wait();

你的代码错了,不会编译。 除此之外,您试图在任务中包装async调用,在这种情况下这是多余的。 您正在尝试创建一个任务来运行任务,而不需要它。

异步签名默认返回一个任务,只需将它们传递给WhenAll

如果我只是在没有等待的情况下调用Task.WhenAll(job0,job1),程序会在等待之前结束吗?

调用async方法将返回已启动的任务。 因此,没有必要强制它运行的实际代码。 但是,因为任务已启动,所以需要等待一些事情,或者在示例中该过程将结束

Task.WhenAll聚合任务时,它不会为你启动它们,但是如果你不wait它,或者await它,它的自我只是让控制流程到应用程序的退出

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM