gpt4 book ai didi

c# - 如何在 C# 中的异步方法中忘记同步上下文

转载 作者:行者123 更新时间:2023-11-30 12:10:56 25 4
gpt4 key购买 nike

假设我想编写一个异步方法 M。我不知道将使用哪种同步上下文(UI、ASP.NET、控制台应用程序等)来调用它。我想让该方法尽可能易于使用。这意味着任何人都应该能够通过访问返回的 Task 的 Result 成员来同步调用它。

public async Task<int> M()
{
// lot's of calling of helper methods including awaits, etc.
// helper methods not owned by me
// ...

return 42;
}


// this should be safe to do from any synchronization context
int result = M().Result; // Synchronously wait

问题是方法 M 的调用者的同步上下文被泄露给了 M 的被调用者。如果他们中的任何一个想要在传入的同步上下文上继续,那么它可能会死锁(例如,当使用 UI 同步时上下文)。

在调用 M 时忘记同步上下文的一种解决方案是将 M 的内容包装在 Task.Run 中。但是,这将强制线程跳转,包括在 M 中的所有任务都已完成并且所有内容都可以在同一线程上同步运行而无需上下文切换的情况下。是否有更好的解决方案来忘记线程的同步上下文?还是我遗漏了什么,这会使这个问题变得无关紧要?

最佳答案

I'd like to make the method as easy to use as possible. That means that anyone should be able to call it synchronously by accessing the Result member of the returned Task.

没有简单的方法来 create a synchronous wrapper for an asynchronous method .最好让异步方法异步。

可以使用ConfigureAwait(continueOnCapturedContext: false)来丢弃上下文,但它不会比Task.Run好多少在您的情况下,因为您无法更改 M 调用的方法。

关于c# - 如何在 C# 中的异步方法中忘记同步上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16827864/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com