多线程——如何调用Action

Multithreading - how to invoke Action

我有一些带有操作按钮的菜单弹出窗口。这是弹出窗口,因此它是在新线程中制作的。我将事件添加到创建的按钮,如下所示:

private StdProcedure m_ToInvoke;

public void AddButton()
{
    Button myChildTempButton = new Button();
    myChildTempButton.ItemClick += new ItemClickEventHandler((x, y) => 
    { 
       HidePopup(); m_ToInvoke = myOpp.Procedure; 
    });
 }

StdProcedure 是委托

 public delegate void StdProcedure();

关闭事件后:

 protected override void OnPopupClosed()
 {
    base.OnPopupClosed();
    if (m_ToInvoke != null) m_ToInvoke.Invoke();
 }

这不能正常工作。有时调用的操作会停止我的另一个线程,我不明白它是如何工作的。

我的问题是:

m_ToInvoke()
m_ToInvoke.Invoke()
m_ToInvoke.BeginInvoke()
m_ToInvoke.DynamicInvoke()

我应该在这里使用什么?

对我来说,第一和第二在效果上是一样的。

  • m_ToInvoke() 只是 m_ToInvoke.Invoke()
  • 的 C# 语法糖
  • m_ToInvoke.Invoke() 在同一线程中同步执行委托
  • m_ToInvoke.BeginInvoke() 安排委托在线程池线程中调用;返回的IAsyncResult可以用来等待完成,也可以传入回调
  • m_ToInvoke.DynamicInvoke() 是这些方法中唯一由 Delegate 声明的方法 - 它类似于通过反射调用它,因为 number/type 没有编译时安全性论点等

请注意,在委托上调用 Invoke/BeginInvoke 与调用 Dispatcher.Invoke/BeginInvokeControl.Invoke/BeginInvoke 非常不同,后者与在 UI 线程用于 WPF/WinForms 应用程序 - 尽管 Invoke 版本是同步的,而 BeginInvoke 是异步的。