C# 在异步操作之后立即调用Task.Wait()是否等同于同步运行同一操作?
换句话说,就是C# 在异步操作之后立即调用Task.Wait()是否等同于同步运行同一操作?,c#,asynchronous,task,C#,Asynchronous,Task,换句话说,就是 var task = SomeLongRunningOperationAsync(); task.Wait(); 功能上与相同 SomeLongRunningOperation(); 换句话说,就是 var task = SomeOtherLongRunningOperationAsync(); var result = task.Result; 功能上与相同 var result = SomeOtherLongRunningOperation(); 根据,如果正在等待的
var task = SomeLongRunningOperationAsync();
task.Wait();
功能上与相同
SomeLongRunningOperation();
换句话说,就是
var task = SomeOtherLongRunningOperationAsync();
var result = task.Result;
功能上与相同
var result = SomeOtherLongRunningOperation();
根据,如果正在等待的任务已经开始执行,Wait
必须阻止。但是,如果尚未开始执行,Wait
可能能够将目标任务从其排队的计划程序中拉出,并在当前线程上内联执行
这两种情况是否仅仅是决定任务将在哪个线程上运行的问题,如果您仍在等待结果,这是否重要
如果异步调用和
Wait()
之间没有执行任何操作,那么使用异步表单比使用同步表单有什么好处?以下是一些区别:
aggregateeexception
中。异常堆栈将不同任务
会产生一个记忆障碍,它会产生同步效果请注意,
Wait
和Result
在所有这些方面都是等效的。由于某个LongRunningOperation返回一些结果,我假设您的意思是var Result=task.Result
task.Result是一个阻塞操作。无需Wait()
True。那为什么要等待呢?你说对了。不用了<代码>变量结果=任务结果代码>就足够了。罗伯特,如果任务没有返回任何东西,你就要等待它。听起来风险并没有超过好处(如果有的话。你没有提到任何好处)。你期望什么好处?我不知道有什么,除非您明确希望列出任何行为。我在一些我没有编写的代码中发现了这一点,并假设一定有某种原因。但在我发现的代码中没有任何东西表明它需要这些行为,等待和结果是等价的。如果没有可用的同步版本,那么这是一个很好的理由,假设他出于某种原因真的想拥有一个同步操作模式(可能他正在实现一个接口)。在典型的ASP.NET代码中,这种阻塞很容易出现死锁。@TheodorZoulias我编辑了这篇文章。事实上,这是一个语言错误。谢谢你指出这一点。