Console程序中的任务和异步

Ari*_*rie 2 c#

我刚刚阅读了控制台项目中的特殊情况.你能告诉我我的做法是否正确吗?那里的两个工作我不确定我是否应该像在这里一样使用等待在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();
  }

}
Run Code Online (Sandbox Code Playgroud)

AAA*_*ddd 8

大部分代码都不需要

此外,如果你做你的,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)
}
Run Code Online (Sandbox Code Playgroud)

使您的主要异步

Project -> Build -> Advanced - Language Version >= 7.1
Run Code Online (Sandbox Code Playgroud)

其他资源

Task.WhenAll方法

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

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

更新

Arie:要清楚地忘记Async Main

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

Task.WhenAll(job0, job1).Wait();
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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