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

本文关键字:对话框 不起作用 任务 Delay 等待 | 更新日期: 2023-09-27 18:08:40

你好我有winforms应用程序。在应用程序中,我有输入表格。A想模拟点击"确定"按钮后的延迟。但代码正在运行,并且表单在单击后立即关闭。请帮忙。

按钮已将DialogResult设置为"确定">。我使用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;
}

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

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

btnOK_Click方法在Task.Delay启动延迟后立即返回,因为它是async方法。此时,对话框将关闭,并且显示为Task.Delay不起作用。

要阻止这种情况发生,可以从按钮中删除DialogResult属性,并在await语句之后将父窗体的DialogResult设置为OK,然后手动调用Close方法。

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

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

来自MSDN按钮对话框结果:

如果此属性的DialogResult设置为无,如果父窗体是通过ShowDialog显示的方法,单击该按钮可关闭父窗体,而无需连接任何事件。

如果您确实连接了一个事件,这也会关闭窗体。

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