今天我正在重構Visual Studio擴展項目中的一些代碼(對於2013年),我遇到了一些奇怪的事情。視覺工作室擴展,後臺工作人員和用戶界面
在代碼中有一個執行持久任務的後臺工作人員。裏面的dowork
事件代碼那裏調用Visual Studio的UI組件。令我驚訝的是,這些代碼毫無例外地執行當我認爲UI更新只能在progresschanged
和doworkcomplete
事件中完成時,我過時了嗎?
驚訝,因爲我是我試圖執行一個Visual Studio中下面的代碼(2013年)擴建項目:
private void StartAJob()
{
BackgroundWorker bgWork = new BackgroundWorker();
bgWork.DoWork += Work;
bgWork.RunWorkerAsync();
}
private void Work(object sender, DoWorkEventArgs e)
{
var statusBar = (IVsStatusbar)GetService(typeof(SVsStatusbar));
statusBar.Progress(1, 1, "Starting a job...", 0, 2);
//do something that that takes a while
statusBar.Progress(1, 1, "A little longer...", 1, 2);
//do something else
statusBar.Progress(1, 1, "Done!", 2, 2);
MessageBox.Show("yay?");
}
這是否意味着我可以savely執行接口代碼在DoWork的事件現在(他們總是告訴我不)。或者,這是一些視覺工作室的魔力,可以解決遠離我的代碼的異常。
只是猜測,但可能是VS組件被寫入來檢查是否需要同步調用d到UI線程(例如就像你會用'InvokeRequired'查詢) –
同意以前的評論。很可能有同步代碼。這不是唯一的 - 例如,WPF綁定可以爲您做同步。 – Dennis
@ZdeslavVojkovic我認爲這將是沿着這些路線。但我無法找到任何支持它的理論。 –