GUI线程上的所有回调 - 多线程问题可能吗?

时间:2010-05-08 10:17:37

标签: c# multithreading

我们有一个外部数据提供程序,它在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应该执行时执行。

在这里,线程是否有问题?从理论上讲,由于所有回调都在同一个线程上,所以它们应该被序列化,对吧?那么这里应该不需要线程同步吗?

1 个答案:

答案 0 :(得分:1)

即使这些回调不在同一个线程上,它们也不是您问题的原因,因为您的回调方法完全是reentrant。没有什么可以让你同步。

问题必定在其他地方,或者我不能正确理解你的问题:)


PS:与the other threading question you posted相关,违反了这条规则:

  • 必须仅对呼叫者提供的数据有效。

因此它不是可重入的。接受的答案指出了为什么它也不是线程安全的。