2016-11-29 7 views
1

私は非同期処理(それ自体が多くのスレッドを使用する)を備えたマルチスレッドアプリケーションを持っています。非同期がなければ、現在のスレッド識別子をログに格納するだけで、実行フローを記録してトレースすることが容易になり、どのスレッドがどのログラインを実行したかを知ることができます。マルチスレッド非同期コードでのログイン

非同期環境で同様のことを達成するにはどうすればよいですか?多くの場合、awaitが呼び出されると、次のコードが別のスレッドに割り当てられます(スレッドプールマネージャがこれらの割り当てを効率的に行うことができます)。問題は、突然、実行フローにこの固定スレッドIDがなく、2つの部分をまとめることが難しいことです。

コード全体に保持されるタスクの識別子はありますか?私は、メソッドで5倍の呼び出しを待っているとしましょう。スレッドIDを使用すると、ログに最大6つの異なるIDが表示されます。私は一つのことがほしいと思います。もし既に存在するなら、私は好きです(私はオブジェクトを作成してそれを私のログ機能に何度も渡すことができますが、何かがあればそれは良いでしょう)。

Task.IdまたはTask.CurrentIdはこの目的に適していますか、それとも何か他のものですか?

+0

作成するタスクごとにid(例:自動インクリメントを使用)を生成するだけで済みます。しかしそれを通すこと(例えば 'ContinueWith')も別の問題です。 – Sinatr

+0

私は利用可能な識別子の準備ができているかどうかもっと尋ねています。私はそれが手動でプログラムできることを知っていますが、それは実際に私が避けたいものです。 – Wapac

+0

Task.IdはTaskインスタンスの識別子ですが、この記事を読んだら、少しの情報を得ることになります。[Task.Idのいくつかの言葉](http://blog.stephencleary.com/2013/03 /afew-words-on-taskid-and.html) – Fabio

答えて

3

"相関ID"、またはlog4netが "ネスト診断コンテキスト"(NDC)と呼んでいるものを指しています。あなたが持っているどのようなロギングフレームワークでも、既に1つ、おそらくasyncで動作する可能性があります。

あなた自身を構築する必要がある場合、私は(基本的にLogicalSetDataしかし、使い簡単に、よりポータブルAPIである)AsyncLocal<T>に、id(またはIDSの不変スタック)を置くことをお勧めしたいです。非同期コンテキストデータは不変でなければならないことに注意してください。詳細はmy blogを参照してください。

0

ノーおそらくですが、あなたはCallContextを使用することができ、特にLogicalSetDataないだけSetData()、およびインスタンスのGUIDを追加する「を使用することができ識別子を行く準備ができて[あり]です」との答えを考えますそれはすべての非同期待機フォークを横断して流れます。

関連する問題