给定 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
按钮时,在由ThreadPool管理的另一个线程上执行AsyncMethod
方法。一段时间后,工作完成,结果通过另一个事件回发。此事件处理程序(
WorkCompleted
)在用于运行AsyncMethod
的线程上执行,因为在执行应用程序时,您会遇到“Cross-Threading”异常。因此,问题是如何在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()