簡體   English   中英

C#異步/等待並顯示對話框

[英]C# async/await and showing dialog

如何處理,如果需要在await函數內部顯示對話框?

例如plz考慮以下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();
}

從等待代碼運行對話框會導致跨線程異常。

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

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

使用invoke可以在主線程上調用表單方法:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM