代码之家  ›  专栏  ›  技术社区  ›  Learner

C多个源、不同的线程、一个事件处理程序

  •  3
  • Learner  · 技术社区  · 14 年前

    我需要一个在穿线和举办活动方面有高技能的人。

    我上的是抽象课 A 两个混凝土等级 C1 , C2 (例如插件)。

    因为我需要他们之间的交流,比如“插件应用”“插件插件”的交流,我有一个方法 ExecuteCommand 在抽象类中,应该完成这一点。此函数引发 event 为了处理某个命令并返回结果(例如,如果一个插件需要它调用的应用程序中的数据 执行程序 并等待应用程序上处理的事件处理程序附带的结果)。

    protected object ExecuteCommand(SvcCmdType cmdType, params object[] inputParams)
    {
      // this code has been simplified
      SvcCommandEventArgs eventArgs = new SvcCommandEventArgs(cmdType, inputParams);
    
      // generate processing command event (it requires to fill in the result)
      OnProcessingAppCommand(this, eventArgs);
    
      return eventArgs.OutputParamsList; 
    }
    

    这个 问题 是:

    如果每一个 C1 C2 后面有不同的线程,同时调用 执行程序 从它们自己的线程内部,然后确定我的设计将被破坏,返回的结果将是意想不到的。

    这个场景的最佳设计是什么?我想在里面用 执行程序 异步调用,如使用 AsyncOperation …但这是正确的方式吗?

    编辑: 我想我正在寻找:对于我的场景,同步或异步方式更好吗?或者,我应该在插件的线程中处理应用程序事件处理程序,还是在主线程的某个地方进行同步?

    我真的很感激你对我的建议有一些很好的解释

    谢谢您。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Merlyn Morgan-Graham    14 年前

    在公共资源或代码块上执行线程同步的常见简单方法是使用互斥体(在本例中是关键部分)。使用lock语句:

    http://msdn.microsoft.com/en-us/library/c5kehkcz(VS.71).aspx

    本文说要对“this”指针进行锁定,但这可能很危险,因为外部调用程序也可以获取相同的锁,这可能会破坏程序。锁定一个私有类变量。

    下面是对示例代码的一些修改,以合并锁定/A关键部分:

    class SomeClass : ISomeInterface
    {
      protected object ExecuteCommand(SvcCmdType cmdType, params object[] inputParams)
      {
        lock(executeCommandLock)
        {
          SvcCommandEventArgs eventArgs = new SvcCommandEventArgs(cmdType, inputParams);
          OnProcessingAppCommand(this, eventArgs);
          return eventArgs.OutputParamsList; 
        }
      }
    
      private Object executeCommandLock = new Object();
    }
    

    编辑:

    (引自评论)。您提到过,您可能希望在单个线程上异步处理对executeCommand的所有调用。您可以使用Dispatcher类完成此任务:

    http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.aspx

    在一个线程上获取对调度程序的引用。将该引用传递给其他线程。当这些线程想要调用ExecuteCommand时,它们使用Dispatcher.BeginInvoke。因为它们使用begininvoke,所以对executeCommand的所有调用都将异步操作,而不会阻塞该线程。但是,每个版本的executeCommand都将排队,并按顺序运行Dispatcher线程。