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();
}

await コードからダイアログを実行すると、クロススレッド例外が発生します。

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

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

1 に答える 1

0

メイン スレッドでフォーム メソッドを呼び出すには、invoke を使用します。

var captcha = new CaptchaForm();
var result = captcha.Invoke(new MethodInvoker(delegate()
{
    captcha.ShowDialog(this);
    return captcha.UserCaptcha;
}));
于 2013-10-09T09:20:49.337 に答える