【问题标题】:await Task.Delay() doesnt work. Dialog close immediately等待 Task.Delay() 不起作用。对话框立即关闭
【发布时间】:2016-09-23 19:42:30
【问题描述】:

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

按钮已将 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;
}

【问题讨论】:

  • 那么什么是关闭表单?您所展示的只是一个按钮单击处理程序...
  • @JonSkeet 我相信 DialogResult 会关闭表单。
  • 对话框不会自行关闭。您没有显示其他一些代码正在执行此操作。除非您可以显示此代码,否则我们无法回答问题。如果您可以显示此代码,那么您可能可以自己回答问题。
  • 您已经接受了答案,但希望您可以通过提供 minimal reproducible example 来了解如何避免混淆,我们可以自己运行以重现该问题。
  • @BeranekCZ:这取决于您是否想让人们更容易地帮助您,并使您的问题对未来的读者更有价值。就个人而言,出于对那些试图帮助你的人的尊重,以及让世界变得更美好的考虑,我会同时鼓励这两者。 (我不知道设置 DialogResult 属性会产生这种效果。如果您提供了一个简短但完整的示例,我可以很容易地弄清楚发生了什么并为您提供帮助。“最低要求”和“使问题变得好的所有信息”。)

标签: c# winforms async-await


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    来自MSDN Button.DialogResult

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-09-11
      • 2020-06-02
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-09
      • 2020-02-12
      • 1970-01-01
      相关资源
      最近更新 更多