我们有一个外部数据提供程序,它在construtor中接受一个回调线程来返回数据。
系统中存在一些我怀疑与线程有关的问题,但理论上它们不可能,因为回调应该都在同一个线程上返回。
我的问题是,这样的代码是否需要线程同步?
class Foo
{
ExternalDataProvider _provider;
public Foo()
{
// This is the c'tor for the xternal data provider, taking a callback loop as param
_provider = new ExternalDataProvider(UILoop);
_provider.DataArrived += ExternalProviderCallbackMethod;
}
public ExternalProviderCallbackMethod(...)
{
//...(code omitted)
var itemArray[] = new String[4] { "item1", "item2", "item3", "item4" };
for (int i = 0; i < itemArray.Length; i++)
{
string s = itemArray[i];
switch(s)
{
case "item1":
DoItem1Action();
break;
case "item2":
DoItem2Action();
break;
default:
DoDefaultAction();
break;
}
//...(code omitted)
}
}
}
问题是,很少有DoItem2Action在DoItem1Action应该执行时执行。
在这里,线程是否有问题?从理论上讲,由于所有回调都在同一个线程上,所以它们应该被序列化,对吧?那么这里应该不需要线程同步吗?
答案 0 :(得分:1)
即使这些回调不在同一个线程上,它们也不是您问题的原因,因为您的回调方法完全是reentrant。没有什么可以让你同步。
问题必定在其他地方,或者我不能正确理解你的问题:)
PS:与the other threading question you posted相关,违反了这条规则:
因此它不是可重入的。接受的答案指出了为什么它也不是线程安全的。