c# - Console 程序中的任务和异步

标签 c#

我刚刚阅读了控制台项目中的特殊情况。你能告诉我我的方法是否正确。那里有两个工作我不确定我是否应该像我在这里所做的那样在 Task.Run 中使用 await,如果它是正确的,你能解释一下如果我从这里删除两个等待会有什么不同。下一个问题是,如果我从 WhenAny 中删除 .Wait() 会怎样。通常在控制台应用程序中它是正确的方法吗?到目前为止忘记提出 async 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 设置为 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)
}

使您的 Main 异步

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

其他资源

Task.WhenAll Method

Creates a task that will complete when all of the supplied tasks have completed.

Can't specify the 'async' modifier on the 'Main' method of a console app

更新

Arie : to make this clear forget about async Main

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

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

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

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

If i just call Task.WhenAll(job0, job1) without Wait at the end program would end before waiting?

调用 async 方法会返回一个已经启动的任务。所以没有必要的实际代码来强制它运行。但是,由于任务已启动,因此需要以某种方式等待它,或者在示例中该过程将结束

Task.WhenAll 聚合任务,它不会为您启动它们,但是如果您不waitawait 它,它本身只是让控制流通过应用程序的导出

关于c# - Console 程序中的任务和异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53058597/

相关文章:

c# - .NET 上的 HTTP/2(HTTP2 或 SPDY)

c# - 从 C# : should I pass StringBuilder or use unsafe code? 调用非托管函数

c# - 如何在 C# 代码(不是 XAML)中设置绑定(bind)到 ScaleTransform 的 ScaleX?

C# - 告诉 Process.Start 等待上一个实例完成

c# - 如何在不转换时间的情况下更改 ZonedDateTime 的时区

c# - 避免 Task 和 Task<T> 的重复方法

c# - Unity找不到其他GameObject的脚本

c# - 如果您知道访问模式不利,ConcurrentBag 仍然是支持对象池的正确选择吗?

c# - 为跨多个程序集的特定类型的实例实现中央 'manager' 类

c# - 将绝对路径转换为相对路径C#