1

我正在爲Excel中的VSTO插件,我部署了一個後臺工作來完成一些任務。一旦後臺工作人員完成了它的工作,我需要更新工作表中的一些內容。 我使用Background RunworkerCompleted Event完成此任務,一旦後臺工作人員完成其任務。根據下面的帖子:背景RunworkerCompleted事件不會觸發VSTA_Main主題:Excel VSTO插件

中提到,背景RunWorkerCompleted事件時,如果BackgroundWorker的是在UI線程創建的UI線程中觸發。我已經在外掛程序提供的VSTA_Main線程上部署了我的後臺工作程序,但與其關聯的後臺RunworkerCompleted事件在任意工作線程上被觸發。我對此問題有以下疑問:

  1. VSTA_Main線程與Excel的UI線程不同嗎? (我想是的,但我只是想確認)

  2. 如何管理使用的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

+0

你可以顯示你開始的代碼嗎?開始和結束時的線程ID是什麼? –

+0

嗨帕特里克,剛剛添加了代碼:) –

+0

線程Id隨着每次運行而變化。最初,代碼在調用後臺工作線程的VSTA_Main線程上運行。然後在不同的工作線程(不是VSTA_Main而不是後臺工作線程)上觸發後臺工作者的任務完成後的後臺RunworkerCompleted事件。這3個線程的線程ID在不同的運行中是不同的 –

回答

0
  1. 是VSTA_Main線程不同於Excel的UI線程? (我想是的,但我只是想確認)

我不知道這一點(我發現這個問題,通過在google VSTA_Main),但是從我的理解,訪問UI元素在VSTO插件必須在這個VSTA_Main線程上完成。

  • 如何可以通過使用的SynchronizationContext(或任何其它可能的方法中),以使背景RunWorkerCompleted事件是所希望的螺紋燒製管理線程部署。
  • 這似乎是在VSTO的一個錯誤,這裏是一個解決辦法:BackgroundWorker Not working in VSTO