2014-09-06 53 views
0

這是我的winform,它是從VSTO插件打開的。它上有一個按鈕,觸發一個異步任務(一個異步Web請求)和響應是否滿意其關閉形式:(異步)等待後關閉窗體

public partial class MyForm : Form 
{ 
    private async void Btn_Click(object sender, EventArgs e) 
    { 
     var response = await doAsyncRequest(); 
     if (response.Worked()) 
     { 
      Close(); 
     } 
    } 
} 

一切都很好,直到達到Close()調用close形式,這裏的中例外:System.InvalidOperationException - Additional information: Cross-thread operation not valid: Control 'MyForm' accessed from a thread other than the thread it was created on.

當從VSTO功能區直接啓動時,其他異步/等待的東西工作正常。

+2

*應該*可以,假設'doAsyncStuff'剛剛返回一個'Task ',並且在UI線程上調用了'Btn_Click' ... – 2014-09-06 10:54:08

+0

這個炸彈當你自己關閉窗口時代碼呢。還有另一個線程可以阻止應用程序終止。使用調試器的Debug + Windows +線程來查看正在運行的線程。並且窗體的Enabled屬性可以避免這種DoEvents失敗模式。 – 2014-09-06 11:52:13

+0

doAsyncStuff在做什麼?它以任何方式訪問用戶界面嗎? – 2014-09-08 07:02:42

回答

0

問題是,Close()會銷燬視覺元素 - 而視覺元素只能從創建它們的線程訪問。因此,您必須切換到主線程才能關閉表單。

雖然我是很新,這個東西我迄今已成功地處理這樣的事情有:

delegate void DoUICallback(); 

,並從異步代碼中:

DoUICallback Callback = new DoUICallback(CallClose); 

最後:

private void CallClose() 
{ 
    // Whatever UI code you want to do 
    Close(); 
} 

我還沒有試過用這種方式關閉窗體,我所有的東西都顯示了什麼我可以立即將數據庫內容放入後臺,以便在加載時顯示。

+0

請,如果你打算倒下,說出原因! – 2016-02-18 05:28:26