我有一些带动作按钮的菜单弹出窗口。这是弹出窗口,因此它是在新线程中创建的。我将事件添加到创建的按钮,如下所示:
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()
我应该在这里使用什么?
对我而言,第一和第二是有效的。
答案 0 :(得分:2)
m_ToInvoke()
只是m_ToInvoke.Invoke()
m_ToInvoke.Invoke()
在同一个线程m_ToInvoke.BeginInvoke()
在线程池线程中调度委托以进行调用;返回的IAsyncResult
可用于等待它完成,您也可以传递回调m_ToInvoke.DynamicInvoke()
是Delegate
声明的唯一一种方法 - 它类似于通过反射调用它,因为它没有编译时的安全性参数的数量/类型等。请注意,在委托上调用Invoke
/ BeginInvoke
与调用Dispatcher.Invoke/BeginInvoke
或Control.Invoke/BeginInvoke
非常不同,这与调用UI线程中的委托有关一个WPF / WinForms应用程序 - 尽管Invoke
版本是同步的,BeginInvoke
是异步的。