8

StackOverflow ミニプロファイラーを使用してプロファイリングしている C# Web サーバーがあります。これは ASP.NET サーバーではありませんが、通常、各要求は独自のスレッドで実行されるため、ミニプロファイラーを調整して、ThreadStaticストレージを使用して着信要求のすべてのプロファイラーを最初から最後まで追跡しました。これはうまくいきました。

最近、すべてを use に変換しました。これは、通常、async/awaitの後の継続が同じものに戻らないため、ストレージが機能しなくなったことを意味します。awaitThreadThreadStatic

ThreadPoolこの場合、異なるスレッド間で小さなデータを渡す最良の方法は何ですか? SynchronizationContextこのようなものに役立つ既存の実装はありますか?

4

1 に答える 1

8

この場合、異なる ThreadPool スレッド間で小さなデータを渡す最良の方法は何ですか?

CallContextクラスを介した論理呼び出しコンテキストの使用。と の 2 つの静的メソッドを公開LogicalSetDataLogicalGetDataます。ExecutionContext呼び出しコンテキストは、同期コンテキストなども担当する を介して保存およびマーシャリングされます。

このクラスの使用には 2 つの制限があります。

  1. .NET 4.5 以降の使用に制限されている

  2. 論理呼び出しコンテキストはコピー オン ライト セマンティクスを使用し、データが変更されると浅いコピーを実行します。これは、参照が複数のスレッド間で共有される可能性があるため、不変データのみを使用する必要があることを意味します。

最後に注意すべきことはCallContext、呼び出したときにのみ初期化されることです。これは、それを使用すると、コピーオンライトのためにオーバーヘッドが発生することを意味します。

詳細については、Stephan Cleary によるImplicit Async Contextという投稿を参照してください。

于 2015-04-22T20:55:51.630 に答える