我正在创建一个对输入执行顺序处理的组件。由于它将托管在几个不同的进程中,我需要它是线程安全的。起初,我故意在代码中忽略了线程安全。现在是时候介绍它了。
首先,我想一开始就引发一个错误,但没能做到。这是处理引擎代码的简化版本:
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();
}
}
我预计其中一些线程会与另一个线程发生冲突并混淆它们的结果,但令我惊讶的是这并没有发生。
对此可能有一个简单而合乎逻辑的解释,但它让我难以理解。或者只是代码太简单导致两个线程同时摆弄输入/输出变量?