多线程——如何调用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/BeginInvoke
或 Control.Invoke/BeginInvoke
非常不同,后者与在 UI 线程用于 WPF/WinForms 应用程序 - 尽管 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()
我应该在这里使用什么?
对我来说,第一和第二在效果上是一样的。
m_ToInvoke()
只是m_ToInvoke.Invoke()
的 C# 语法糖
m_ToInvoke.Invoke()
在同一线程中同步执行委托m_ToInvoke.BeginInvoke()
安排委托在线程池线程中调用;返回的IAsyncResult
可以用来等待完成,也可以传入回调m_ToInvoke.DynamicInvoke()
是这些方法中唯一由Delegate
声明的方法 - 它类似于通过反射调用它,因为 number/type 没有编译时安全性论点等
请注意,在委托上调用 Invoke
/BeginInvoke
与调用 Dispatcher.Invoke/BeginInvoke
或 Control.Invoke/BeginInvoke
非常不同,后者与在 UI 线程用于 WPF/WinForms 应用程序 - 尽管 Invoke
版本是同步的,而 BeginInvoke
是异步的。