【问题标题】:Task and asynchronous in Console program控制台程序中的任务和异步
【发布时间】:2018-10-30 15:11:04
【问题描述】:

我刚刚阅读了有关控制台项目的特殊情况。你能告诉我我的方法是否正确。那里的两个工作我不确定我是否应该像我在这里所做的那样在 Task.Run 中使用 await,如果它是正确的,你能解释一下如果我从这里删除两个 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();
  }

}

【问题讨论】:

  • what would be the diffrence if i would delete both awaits from here.你尝试的时候发生了什么?
  • 假设你已经看过stackoverflow.com/questions/9208921/…...你可以使用最新的VS并使用async Main吗?
  • 为什么不想使用 async main?
  • 使用低于 4.5 的网络框架,可能会影响理解行为

标签: c#


【解决方案1】:

大部分代码都不需要

此外,如果您将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)
}

让你的 Main 异步

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

其他资源

Task.WhenAll Method

创建一个将在所有提供的任务都完成时完成的任务 完成。

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

更新

Arie :为了清楚起见,忘记异步 Main

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

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

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

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

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

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

Task.WhenAll 聚合任务,它不会为您启动它们,但是如果您不为它 waitawait 它,它自己只会让控制流到出口应用

【讨论】:

  • 如果我只是在没有 .Waitat 的情况下调用 Task.WhenAll(job0, job1) 结束程序会在等待之前结束吗?
  • 是的,程序会提前结束。
  • @Arie 不幸的是,我无法在 cmets 中向您解释一切,这将变成一个永无止境的问题循环,探索Task await async 的所有可能排列。我已经解释了为什么您的代码是多余的,如果您还有其他具体问题,请随时再次提问
  • @TheGeneral 我理解它是因为我有 Wait on Task.WhenAll(job0, job1) 然后在我的工作调用中额外的 async () => await 是多余的,对吗?但是,如果我没有 Task.WhenAll(job0, job1).Wait();那我可以吗?
  • @Arie 是的,这就是你今天用完的评论问题限制
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-14
  • 1970-01-01
  • 2015-10-05
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
相关资源
最近更新 更多