我正在爲Excel中的VSTO插件,我部署了一個後臺工作來完成一些任務。一旦後臺工作人員完成了它的工作,我需要更新工作表中的一些內容。 我使用Background RunworkerCompleted Event完成此任務,一旦後臺工作人員完成其任務。根據下面的帖子:背景RunworkerCompleted事件不會觸發VSTA_Main主題:Excel VSTO插件
中提到,背景RunWorkerCompleted事件時,如果BackgroundWorker的是在UI線程創建的UI線程中觸發。我已經在外掛程序提供的VSTA_Main線程上部署了我的後臺工作程序,但與其關聯的後臺RunworkerCompleted事件在任意工作線程上被觸發。我對此問題有以下疑問:
VSTA_Main線程與Excel的UI線程不同嗎? (我想是的,但我只是想確認)
如何管理使用的SynchronizationContext(或任何其他可能的方法),這樣的背景RunWorkerCompleted事件時所需的線程中觸發線部署。
在我的情況下,簡化的代碼看起來是這樣的:
// This code piece executes on VSTA_Main thread
private BackgroundWorker backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker_DoWork);
backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
backgroundWorker.RunWorkerAsync();
// This code piece executes on some random worker thread - Assume Thread 1
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
// It simulates some task
Thread.sleep(100)
}
// This event is raised on a random worker thread - Not Thread 1 and not VSTA_Main
private void backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// perform some sheet update operations
}
我目前正在對微軟的Visual Studio 2010和Microsoft Excel 2007
你可以顯示你開始的代碼嗎?開始和結束時的線程ID是什麼? –
嗨帕特里克,剛剛添加了代碼:) –
線程Id隨着每次運行而變化。最初,代碼在調用後臺工作線程的VSTA_Main線程上運行。然後在不同的工作線程(不是VSTA_Main而不是後臺工作線程)上觸發後臺工作者的任務完成後的後臺RunworkerCompleted事件。這3個線程的線程ID在不同的運行中是不同的 –