【发布时间】:2017-03-23 02:22:06
【问题描述】:
我正在开发一个非常庞大且陈旧的桌面 Winform 应用程序代码库。在这个代码库中有很多在后台线程中执行的操作,主要使用BackgroundWorker。
此代码库中的一个常见模式是通过将工件绑定到正在执行的线程来隐藏复杂性。例如,数据库连接和事务存储在[ThreadStatic] 字段中。
我正在尝试更改这一点,并开始使用async/await 代码,并受益于在池的任何线程中运行任务,并允许任务通过使用ConfigureAwait(false) 在任何其他线程中继续执行。我知道[ThreadStatic] 不能与async/await 搭配得很好,而且我在这里阅读了几个答案,建议改用AsyncLocal<T>。
鉴于我正在处理大型代码库,如前所述,我无法一次性切换到任何地方的async/await,我必须逐步进行更改。因此,之前有[ThreadStatic] 的代码将更改为AsyncLocal<T>,但大部分代码将继续使用BackgroundWorker,并且不会命中单个async/await 代码行。
问题
这会奏效吗?我需要能够定义某种上下文流,它可以与我的新 async/await 代码一起使用,并且还要继续使用我的旧非异步代码,它依赖于 [ThreadStatic] 保持每个线程的东西彼此独立。
如果我完全错了并且走错了路,非常欢迎提出建议。
【问题讨论】:
标签: c# async-await threadstatic