最近、Dynamics CRM 2011で1つのプラグイン実行(つまり、Execute()
メソッドのパス)が同じスレッド上にとどまることが保証されているかどうかという質問が出ました。CRM 2011プラグインのスレッディング/アンビエントコンテキスト
私はAmbient Contextパターンを使用してトレースを実装して、トレースしたいクラスにトレースサービスを渡さないようにしたいと考えています。問題は、プラグインが登録されたステップごとに1回のみインスタンス化され、その後同じインスタンスからのすべての後続操作に対応することがわかっていることです。つまり、現在のITracingService
インスタンスを割り当てるTracing.Current
のような静的なプロパティを持つことはできません。これを実行すると、最後に開始された操作によって、まだ実行中の他のすべての操作のインスタンスが上書きされます(この種の同時実行性は珍しくありません)。私はExecute()
方法は同じスレッドに残っているの下にあるすべてのものを確認することができれば
今、私はまだ、静的フィールドに[ThreadStatic]
属性を利用周囲コンテキストを使用することができます。
public static class Tracing
{
[ThreadStatic]
private static ITracingService _current;
public static ITracingService Current
{
get
{
if (null == _current)
{
_current = new NullTracingService();
}
return _current;
}
set { _current = value; }
}
}
私が入る時にこれを設定しますExecute()
メソッドを呼び出し、最後にクリアすると、トレースサービスインスタンスへの参照が削除されます。
種類の MSCRMプラグインのコンテキストでのスレッドについては、個々のスレッドがThreadPoolから来ていることがわかります - 私の問題に関してどのような影響がありますか。
MSCRMプラグインを使用してスレッディングがどのように処理されるかについての深い洞察がありますか?この特別なケースではSOLIDコードを使用してトレースのクロスカット問題をどのようにエレガントに処理できるかについての他のアイデアはありませんか(AOP /オプションはこちら)?
ありがとうございました。
スレッドセーフな方法で実行することについての懸念は理解していますが、なぜ同じスレッドで実行することに懸念があるのか分かりません。もう少し説明できますか? – Daryl
さて、別のスレッドにプラグインの実行を移動させないで、独自のITracingServiceインスタンスを再度「接続」する必要はありません。このような場合にThreadStaticがどのように処理されるかはまだわかりません。 – TeaDrivenDev