鑑於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;
}
當用戶點擊該方法AsyncMethod
對由線程池管理的另一線程執行的按鈕btn
。一段時間後,工作完成,結果通過另一個事件回傳。 此事件處理程序(WorkCompleted
)在用於運行AsyncMethod
的線程上執行,因爲執行應用程序時會出現「跨線程」異常。
所以問題是如何在UI線程上運行事件處理程序MnFrm_WorkCompleted
?
正確的解決方案將取決於'AsyncMethod'實際正在做什麼。如果方法訪問某些外部資源,那麼您的代碼可以更改爲在一個線程上有效運行,而不必擔心線程/調用和其他多線程相關問題。 – Fabio
爲什麼使用'QueueUserWorkItem'而不是'var result = await Task.Run(...)'?它在所有支持的.NET版本中都可用,並將所有這些代碼轉換爲正確處理異步操作的* single *行。最早支持的.NET版本是4.5.2。 「等待」是早些時候在4.5中加入的。 4.0的任務 –
即使您需要從另一個線程報告某些內容,請勿使用事件。這是IProgress界面和'Progresss '類的工作 –