5

このコードがあるとしましょう

ThreadPool.QueueUserWorkItem(unused => 
    {
        SynchronizationContext.SetSynchronizationContext(
            new MyCustomSynchronizationContext());

        // not reset back to null
    }, null);

現在の同期コンテキストがスレッド プールにリークされます。誰かが ThreadPool.QueueUserWorkItem を再度呼び出し、同じスレッドが他の作業項目の処理に使用された場合、そのスレッドの現在の同期コンテキストは null にリセットされますか、それとも MyCustomSynchronizationContext のままになりますか?

Task.Run、BeginInvoke など、スレッド プールでタスクを実行する他の方法にも同じ答えが当てはまりますか?

一般的にTLSはリセットされないことは知っていますが、.NETソースコードは、現在の同期コンテキストのストレージがあまり明確に定義されていないことを示しています(ほとんどの場合、実行コンテキストから来ますが、一部のWinRTでは特別なケースのようです)理由)。

4

1 に答える 1

2

答えは技術的に未定義/文書化されていません。SynchronizationContextスレッドプールスレッドをクリーンアップせずにスレッドに配置することは想定されていません。

SynchronizationContextとはいえ、それがクリアされていないことを強く疑っています。これは、スレッド プールでタスクを実行するすべてのコードに当てはまります。

于 2014-02-26T12:20:18.717 に答える