我刚刚阅读了控制台项目中的特殊情况。你能告诉我我的方法是否正确。那里有两个工作我不确定我是否应该像我在这里所做的那样在 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
其他资源
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
聚合任务,它不会为您启动它们,但是如果您不wait
或 await
它,它本身只是让控制流通过应用程序的导出
关于c# - Console 程序中的任务和异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53058597/