在 .NET 中同步运行异步代码 [duplicate]

Running asynchronous code synchronously in .NET [duplicate]

提问人:Ricardo Peres 提问时间:11/1/2023 最后编辑:Theodor ZouliasRicardo Peres 更新时间:11/2/2023 访问量:84

问:

我知道应该不惜一切代价避免这种情况,但有时,它只需要发生:我们需要同步运行异步代码。 我想知道的是,这两段代码是否有任何差异和/或是否有首选方法,或者是否有更好的替代方案:

//#1
Task.Run(async () =>
{
    await someObject.ProcessAsync();
}).ConfigureAwait(false).GetAwaiter().GetResult();

或者只是简单明了:

//#2
someObject.ProcessAsync().ConfigureAwait(false).GetAwaiter().GetResult();

选项 #1 使用了 / 关键字和所有相关的语法糖,但不确定这是否一定使它变得更好。asyncawait

C# .NET 异步 async-await 任务

评论

2赞 Daniel A. White 11/1/2023
调用 GetResult 可能会死锁
0赞 Ricardo Peres 11/1/2023
正如我所说,我知道应该避免这种情况,但有时却不能避免。我所要求的是最好的方法
2赞 Theodor Zoulias 11/1/2023
Ricardo,我的建议是从 开始,如果死锁,则解决问题。可能在某个地方丢失了。在任何地方使用该方法作为首选选项也有一些优点,例如,如果您正在将旧应用程序从同步转换为异步,并且您希望在中间版本上投入最少的精力。但这也可能导致问题(其他类型的问题),同时效率也略低于直接 ..GetAwaiter().GetResult().ConfigureAwait(false)Task.Run.GetAwaiter().GetResult()
1赞 Theodor Zoulias 11/2/2023
我对示例进行了一些改进。顺便说一句,只有在等待任务时才有效。没有它,它只是死代码。.ConfigureAwait(false)await
1赞 Servy 11/2/2023
然而,你们俩正在讨论 的行为,这肯定会受到该决定的影响,并且在如何影响这两个操作方面并不“有效相同”。整个问题在于此操作的特定语义,即尝试将其从异步转换为同步。如果他们不关心方法的其余部分的运行方式,他们就不会一开始就问这个问题ConfigureAwait

答: 暂无答案