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