2013-10-09 33 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; 
}));