C# 在c中使用WinForm应用程序执行代码的时间延迟#
我尝试使用以下代码延迟2秒:C# 在c中使用WinForm应用程序执行代码的时间延迟#,c#,winforms,C#,Winforms,我尝试使用以下代码延迟2秒: public async Task DoTasks(int seconds) { frmDeleteCertificateProgress f = new frmDeleteCertificateProgress(); f.ShowDialog(); await Task.Delay(seconds * 1000); f.Close(); } 但是当表单打开时,延迟后它不会关闭。我遗漏了什么?由于“ShowDialog”,它等待关闭
public async Task DoTasks(int seconds) {
frmDeleteCertificateProgress f = new frmDeleteCertificateProgress();
f.ShowDialog();
await Task.Delay(seconds * 1000);
f.Close();
}
但是当表单打开时,延迟后它不会关闭。我遗漏了什么?由于“ShowDialog”,它等待关闭表单。您应该使用Show()方法。注意:您正在调用
ShowDialog()
,它有一些非常特定的行为。显示的表单是“模态”的,这意味着它阻止程序中除该表单之外的任何用户输入。在使用ShowDialog()
方法时,这通常是有意的,您过早接受的答案无法保留此行为
ShowDialog()
方法在显示的模式窗体(即“对话框”)关闭之前不会返回。因此,您的延迟和随后对Close()
窗口的调用在太迟之前无法进行,即对话框窗口已经关闭
有许多不同的方法来实现这一点。最简单的方法之一是将关闭窗口的代码放入所示事件的处理程序中:
public void点任务(整数秒)
{
frmDeleteCertificateProgress f=新的frmDeleteCertificateProgress();
f、 显示+=异步(发送方,e)=>
{
等待任务。延迟(时间跨度从秒(秒));
f、 Close();
};
f、 ShowDialog();
}
显示对话框窗口时,将执行处理程序。它将根据您的需要延迟,然后关闭对话框窗口
如果您对延迟的确切时间不太在意,也就是说,您不介意窗口的可见延迟被初始化对话框所需的时间缩短,那么您可以使用“触发并忘记”异步方法:
public void点任务(整数秒)
{
frmDeleteCertificateProgress f=新的frmDeleteCertificateProgress();
CloseAfterDelay(f,TimeSpan.FromSeconds(秒));
f、 ShowDialog();
}
专用异步void CloseAfterDelay(格式、时间跨度延迟)
{
等待任务。延迟(延迟);
form.Close();
}
太棒了。成功了@Tempora:只有当您首先不需要ShowDialog()
时,它才起作用。否则,用户可以在对话框外进行交互,这与ShowDialog()
方法的意图相反。@PeterDuniho我认为,他/她隐藏了表单。否则你是对的。“我想,他/她隐藏了形式”——你怎么会这么想?问题中没有任何东西表明这是真的。@PeterDuniho你是对的。我更喜欢/建议你的解决方案。