2017-08-09 90 views
1

我得到一個跨線程操作無效使用異步/等待在VSTO

跨線程操作無效

...錯誤與下面的代碼。我認爲異步/等待會照顧這一點,但顯然不是。奇怪的是,當我註釋掉textBoxUser.Enabled = false時,錯誤消失。思考?

private async void buttonPopulate_Click(object sender, EventArgs e) 
{ 
    textBoxUser.Enabled = false; 

    await Populate(); 

    textBoxUser.Enabled = true; //error here 
} 
+0

你正試圖從不同的線程訪問GUI元素。你需要一個調用。 – Trey

+0

'private async void buttonPopulate_Click'如果WinForms調用此事件處理程序,則應該在WinForms同步上下文中並繼續在主線程上。你是自己調用這個方法還是從一個定時器調用這個方法,或者實際調用'await Populate()。ConfigureAwait(false);'? –

+0

@MongZhu稍微不同的問題和最新的答案已過時 – MickyD

回答

3

您的問題可能是由於VSTO未正確提供SynchronizationContext;這是Office插件系統長期存在的問題。您可以通過在事件處理程序的開始處檢查SynchronizationContext.Current的值來驗證此情況;如果是null,那麼問題歸因於VSTO。

爲了解決這個問題,你可以在任何async void事件處理程序的開始這樣做:

SynchronizationContext.SetSynchronizationContext(new WindowsFormsSynchronizationContext()); 
+1

確認這工作。謝謝 – dahel