gpt4 book ai didi

多线程 - 如何调用 Action

转载 作者:行者123 更新时间:2023-12-03 13:19:39 27 4
gpt4 key购买 nike

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

private StdProcedure m_ToInvoke;

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

StdProcedure 是委托(delegate)
 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()在同一线程中同步执行委托(delegate)
  • m_ToInvoke.BeginInvoke()安排委托(delegate)在线程池线程中调用;返回的IAsyncResult可以用来等待它完成,也可以传入回调
  • m_ToInvoke.DynamicInvoke()是这些方法中唯一由 Delegate 声明的方法之一- 它类似于通过反射调用它,因为参数的数量/类型等没有编译时安全性。

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

    关于多线程 - 如何调用 Action,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29629513/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com