入力に対して順次処理を実行するコンポーネントを作成しています。いくつかの異なるプロセスでホストされるため、スレッドセーフにする必要があります。最初は、コードから意図的にスレッド セーフを除外しました。今回はそれを紹介します。
まず、最初からエラーを発生させたかったのですが、できませんでした。以下は、処理エンジンのコードの簡略化されたバージョンです。
public Document DoOrchestration(Document input)
{
Document output = new Document();
foreach (var orchestrationStep in m_OrchestrationSteps)
{
var processor = GetProcessor(orchestrationStep).Clone();
output = processor.Process(input);
input = output;
}
return output;
}
プロセッサは私の組織内の他の人によって開発される可能性があり、これには複雑な初期化が含まれる場合があります。これらはスレッド アンセーフである可能性もあるため、プロトタイプ パターンを使用して一意のインスタンスを取得し、それらのスレッド化の問題を回避します。
この機能をテストするために、次のコードを使用しました。
for (int i = 0; i < 20000; i++)
{
Thread t = new Thread(() => TestOrchestration(i));
t.Start();
}
void TestOrchestration(int number)
{
Document doc = new Document(string.Format("Test {0}", number));
doc = DoOrchestration(doc);
if (doc.ToString().Substring(0,35) != strExpectedResult)
{
System.Console.WriteLine("Error: {0}", doc.ToString();
}
}
一部のスレッドが別のスレッドと衝突し、結果が混同されると予想していましたが、驚いたことに、そうはなりませんでした。
これにはおそらく簡単で論理的な説明がありますが、私にはわかりません。それとも、コードが単純すぎて、2 つのスレッドが同時に入力/出力変数をいじるという結果になるのでしょうか?