等待Task.Delay()不起作用。对话框立即关闭

时间:2016-09-23 11:24:45

标签: c# winforms async-await

你好。我有winforms app。在应用程序中我有输入表单。 A想要在点击OK按钮后模拟延迟。但是代码正在运行,单击后表单立即关闭。请帮助。

按钮已将DialogResult设置为OK 。我使用ShowDialog来显示表单。

//btn click handler
private async void btnOk_Click(object sender, EventArgs e)
{
    customer.UserName = "testing";
    await Task.Delay(30000);
    //await Task.Run(()=> System.Threading.Thread.Sleep(30000)); //I tried this too
    return;
}

2 个答案:

答案 0 :(得分:2)

一旦btnOK_Click方法返回,您的对话框就会关闭,因为该按钮的属性设置为DialogResult

btnOK_Click方法会在Task.Delay 开始延迟后立即返回,因为它是async方法。此时对话框关闭,好像Task.Delay无法正常工作。

要阻止这种情况发生,您可以从按钮中移除DialogResult属性,并在DialogResult声明后将父表单OK设置为await然后手动调用Close方法。

private async void btnOk_Click(object sender, EventArgs e)
{
    customer.UserName = "testing";
    await Task.Delay(30000);

    DialogResult = DialogResult.OK;
    Close();
}

答案 1 :(得分:-1)

由于你没有主动从你的btnOK_Click调用Close(),我假设你已经将Button.DialogResult属性设置为DialogResult.OK:

来自MSDN Button.DialogResult

  

如果此属性的DialogResult设置为除以外的任何内容   无,如果父表单是通过ShowDialog显示的   方法,单击按钮关闭父表单,而不是你的   连接任何事件。

如果你确实搞了一个事件,这也会关闭表格。

更好的方法是记住您正在关闭并启动System.Windows.Forms.Timer。 Timer.Tick事件处理程序可以检查您是否正在关闭;设置DialogResult属性并调用Dialog.Close()