gpt4 book ai didi

c# - 如何在目标线程上运行事件处理程序

转载 作者:行者123 更新时间:2023-11-30 23:08:22 27 4
gpt4 key购买 nike

给定C#代码示例:

using System;
using System.Threading;
using System.Windows.Forms;

public class MnFrm : Form
{
private void MnFrm_Load(Object sender, EventArgs e)
{
this.WorkCompleted += MnFrm_WorkCompleted;
}

private void btn_Click(Object sender, EventArgs e)
{
ThreadPool.QueueUserWorkItem(AsyncMethod);
}

private void MnFrm_WorkCompleted(Object sender, Boolean e)
{
MessageBox.Show("Work completed");
}

private void AsyncMethod(Object state)
{
// Do stuff
Boolean result = true; // just as an example
WorkCompleted?.Invoke(this, result);
}

private event EventHandler<Boolean> WorkCompleted;
}

当用户单击按钮 btn 时,方法 AsyncMethod 将在 ThreadPool 管理的另一个线程上执行。一段时间后,工作完成,结果通过另一个事件发回。此事件处理程序 (WorkCompleted) 在用于运行 AsyncMethod 的线程上执行,因为在执行应用程序时会出现“跨线程”异常。

所以问题是如何在 UI 线程上运行事件处理程序 MnFrm_WorkCompleted

最佳答案

您可以使用 Control.Invoke 或 Control.BeginInvoke 方法在 UI 线程上调用特定方法。试试下面的代码:

private void MnFrm_WorkCompleted(Object sender, Boolean e)
{
if (InvokeRequired)
{
Invoke((Action) (() => MnFrm_WorkCompleted(sender, e)));
return;
}
MessageBox.Show("Work completed");
}

Invoke 和 BeginInvoke 的区别: What's the difference between Invoke() and BeginInvoke()

关于c# - 如何在目标线程上运行事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46600085/

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