等待任务.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;
}
一旦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((