我正在创建一个组件,用于对输入执行顺序处理。由于它将在几个不同的进程中托管,因此我需要它是线程安全的。起初,我故意从代码中省略了线程安全性。现在是引入这一点的时候了。
首先,我想先进行一些错误测试,但我无法得到预期结果。以下是该处理引擎的简化版本代码:
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();
}
}
我原本以为一些线程会相互碰撞,导致它们的结果混乱,但令我惊讶的是,这种情况并没有发生。可能有一个简单而合理的解释,但我无法理解。或者是因为这个代码太简单了,不会导致两个线程同时对输入/输出变量进行操作吗?