私は、デスクトップのwinformアプリケーションの非常に大きく古いコードベースに取り組んでいます。このコードベースでは、主にBackgroundWorker
を使用してバックグラウンドスレッドで実行される多くの操作があります。非同期/待機コードでのAsyncLocal <T>の影響を教えてください。
このコードベースの共通パターンは、実行中のスレッドにアーティファクトをバインドすることによって複雑さを隠すことです。たとえば、データベース接続とトランザクションは[ThreadStatic]
フィールドに格納されます。
これを変更して、async/await
コードを使い始めると、プールの任意のスレッドでタスクを実行し、他のスレッドでタスクを実行できるようになります。ConfigureAwait(false)
を使用してください。 [ThreadStatic]
がasync/await
でうまく再生されないことを知っています。代わりにAsyncLocal<T>
を使用するように提案しています。
大きなコードベースに取り組んでいることを考えると、前に述べたように、私はasync/await
に一度に切り替えることができず、徐々にこの変更を行う必要があります。したがって、以前のコード[ThreadStatic]
はAsyncLocal<T>
に変更されますが、コードの大部分はBackgroundWorker
を使用し続け、1つのasync/await
行のコードをヒットしません。
質問
これは機能しますか?新しいasync/await
コードで動作するコンテキストフローを定義できるようにする必要があります。また、すべてのスレッドの内容を互いに独立させておくことに依存していた古い非同期コードを使用し続けます。[ThreadStatic]
私が間違っていて間違った経路を辿った場合、提案は非常に歓迎されます。