C# 在UI线程中引发事件

C# 在UI线程中引发事件,c#,winforms,compact-framework,C#,Winforms,Compact Framework,我需要在UI线程中引发事件,我找到的所有解决方案仅适用于完整框架:例如,具有GetInvocationList和ISynchronizeInvoke的非常简单的解决方案,但NET CF不支持ISynchronizeInvoke。有没有办法在CF的UI线程中引发事件?我的代码如下。我使用.NETCF3.5 class Publisher { public event EventHandler OnEventHandler; private void OnEvent() { va

我需要在UI线程中引发事件,我找到的所有解决方案仅适用于完整框架:例如,具有GetInvocationList和ISynchronizeInvoke的非常简单的解决方案,但NET CF不支持ISynchronizeInvoke。有没有办法在CF的UI线程中引发事件?我的代码如下。我使用.NETCF3.5

class Publisher {
  public event EventHandler OnEventHandler;
  private void OnEvent()
  {
    var handler = OnEventHandler;
    if (handler != null) handler(this, EventArgs.Empty); 
  }
}

我使用
MethodInvoker
,它必须声明(因为它在紧凑框架下不存在),然后包括一个到父控件的链接(通常是主窗体):

希望你能用它做点什么


~Joe

您必须通过构造函数传递控件引用,以便使用其Invoke()方法引发事件。当然,让事件订阅者处理它更容易。是的,我了解控件引用,但我不喜欢这样,因为Publisher对UI、控件等一无所知。此外,视图可能在Publisher创建之后创建。对,这会调用“It's Always Easter”子句。这并非史无前例,SerialPort会在另一个线程上引发事件,例如.Woops。我刚刚读了你给Hans的评论,说不想让出版商订阅这些活动。有没有投票权删除这个答案,或者让其他人从中获益?我知道我需要一些控件实例来使用invoke方法。因此,现在我的出版商可以实现这种控制,您的解决方案运行良好。谢谢
class Publisher {
  #if PocketPC // MethodInvoker delegate is not declared in CF!
  public delegate void MethodInvoker(); 
  #endif
  private Form _parent;

  public Publisher(Form parent) {
    _parent = parent;
  }

  public event EventHandler OnEventHandler;
  private void OnEvent() {
    if (OnEventHandler != null) {
      MethodInvoker mi = delegate { OnEventHandler(this, EventArgs.Empty); };
      try {
        _parent.BeginInvoke(methInvoker);
      } catch (ObjectDisposedException) {
      } catch (NullReferenceException err) {
        LogError("OnEvent NullReference", err);
      } catch (InvalidOperationException err) {
        LogError("OnEvent InvalidOperation", err);
      }
    }
  }
}