47

マルチスレッドを扱っているときに、TransactionScope クラスを正しい方法でどのように使用するのか疑問に思っていました。

メイン スレッドで新しいスコープを作成し、いくつかのワーカー スレッドを生成して、これらをメイン スコープに参加させます。たとえば、スコープが完了しない場合、各ワーカーでロールバックが呼び出されるようにします。

内部で ThreadStaticAttribute を使用して TransactionScope について何かを読んだため、上記が不可能/非常に困難になりました-誰かがどちらの方法でも確認できますか? コードを同期方式で実行すると、ロールバックが機能します。つまり、内部トランザクションはメイン トランザクションに参加できますが、スレッド化された実行に切り替えた場合はできません。

4

2 に答える 2

19

これは正しいです。TransactionScopeクラスはTransaction.Current、属性でマークされたフィールドに値を格納するプロパティを使用しThreadStaticます。

このThreadStatic属性は、フィールド値がスレッド アフィニティを取得するようにします。つまり、各スレッドで一意の値を持つようにします。これは、スレッドでデータを共有するための推奨されるアプローチです。これは、スレッド ローカル ストレージ(TLS)とも呼ばれます。

このTransactionScopeクラスは、現在のスレッドでトランザクション コンテキストを定義するだけです。ただし、コードがそのスレッド内のすべてのジョブを実行する必要があるという意味ではありません。複数のスレッドを使用する複雑な計算アルゴリズムを想像できました。

于 2009-03-23T16:25:15.607 に答える