gpt4 book ai didi

c# - AsyncLocal 在非异步/等待代码中有什么作用?

转载 作者:可可西里 更新时间:2023-11-01 07:55:39 26 4
gpt4 key购买 nike

我正在处理一个非常大且旧的桌面 winform 应用程序代码库。在此代码库中,有很多操作在后台线程中执行,主要使用 BackgroundWorker。 .

此代码库中的一个常见模式是通过将工件绑定(bind)到正在执行的线程来隐藏复杂性。例如,数据库连接和事务存储在 [ThreadStatic] 中字段。

我正在尝试改变这一点,并开始使用 async/await代码,并受益于在池的任何线程中运行任务,并通过使用 ConfigureAwait(false) 允许任务在任何其他线程中继续执行.我知道 [ThreadStatic]不适合 async/await ,我在这里阅读了几个建议使用 AsyncLocal<T> 的答案相反。

鉴于我正在处理大型代码库,如前所述,我无法切换到 async/await一个镜头无处不在,我必须逐渐改变这种变化。所以之前的代码有[ThreadStatic]将更改为 AsyncLocal<T> ,但大部分代码将继续使用 BackgroundWorker不会打一个async/await代码行。

问题
这行得通吗?我需要能够定义某种可与我的新 async/await 一起使用的上下文流代码,并继续使用依赖于 [ThreadStatic] 的旧非异步代码保持每个线程彼此独立。

如果我完全错了,走错了路,欢迎提出建议。

最佳答案

它应该可以工作。

AsyncLocal<T>是逻辑调用上下文的抽象。我描述了the logical call context and how it interacts with async / await 在旧博客文章中有详细介绍。

总而言之,它可能会正常工作,但有一个方面 AsyncLocal<T>这与 ThreadStatic 完全不同.

当您写入 AsyncLocal<T> 时值,该值是为当前逻辑调用上下文设置的。一个async方法将为其逻辑调用上下文建立一个写时复制范围,因此如果您向它写入 within async方法,它将创建一个包含新值的逻辑调用上下文。这允许 async以嵌套方式使用它的方法,其中“内部”上下文可以覆盖“外部”上下文。 但是,“内部”上下文值永远不会流回调用者;当“外部”上下文恢复时,它会完全取代“内部”上下文。

如果没有一个方法是async并且这些值仅从它们自己的线程中设置,那么该线程只有一个逻辑调用上下文,并且写入/读取这些值的工作方式与 ThreadStatic 相同.

关于c# - AsyncLocal<T> 在非异步/等待代码中有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42959056/

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