2013-10-09 62 views
0

如何處理,如果需要顯示對話框裏面的await函數?從等待代碼導致跨線程異常C#異步/等待並顯示對話框

async Task loginButton_Click(...args...) 
{ 
    disable_some_gui_controls(); 

    var svc = new WebSite(); 

    // get captcha from user 
    svc.OnCaptcha +=() => 
    { 
     var captcha = new CaptchaForm(); 
     captcha.ShowDialog(this); 
     return captcha.UserCaptcha; 
    } 

    // login may ask captcha 
    await svc.Login("user", "password"); 

    if (login.Success) 
     enable_some_gui_controls(); 
} 

運行對話框:

例如PLZ考慮這個C#僞代碼。

class WebSite 
{ 
    public delegate string Captcha(); 
    public event Captcha OnCaptcha; 

    public async Task<bool> Login(...args...) 
    { 
     ... 
     if (needs captcha) 
     { 
      string captchaText = OnCaptcha(); 
      ... 
     } 
    } 
} 
+0

什麼方法顯示的對話框? 'loginButton_Click'或'svc.Login'?因爲你說過「等待」代碼「..但是對話框顯示在」await「用法之外。 –

+0

如果需要驗證碼,Login方法發送事件。它在裏面執行登錄 –

+0

您還沒有回答我的問題。這個方法是如何被調用的?這種方法本身在等待嗎? –

回答

0

使用調用調用主線程的形式方法:

var captcha = new CaptchaForm(); 
var result = captcha.Invoke(new MethodInvoker(delegate() 
{ 
    captcha.ShowDialog(this); 
    return captcha.UserCaptcha; 
}));