多线程 - 如何调用Action

时间:2015-04-14 14:05:34

标签: multithreading c#-4.0 action invoke begininvoke

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

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()

我应该在这里使用什么?

对我而言,第一和第二是有效的。

1 个答案:

答案 0 :(得分:2)

  • m_ToInvoke()只是m_ToInvoke.Invoke()
  • 的C#语法糖
  • m_ToInvoke.Invoke()在同一个线程
  • 中同步执行委托
  • m_ToInvoke.BeginInvoke()在线程池线程中调度委托以进行调用;返回的IAsyncResult可用于等待它完成,您也可以传递回调
  • m_ToInvoke.DynamicInvoke()Delegate声明的唯一一种方法 - 它类似于通过反射调用它,因为它没有编译时的安全性参数的数量/类型等。

请注意,在委托上调用Invoke / BeginInvoke与调用Dispatcher.Invoke/BeginInvokeControl.Invoke/BeginInvoke非常不同,这与调用UI线程中的委托有关一个WPF / WinForms应用程序 - 尽管Invoke版本是同步的,BeginInvoke是异步的。