应用程序退出时显示等待消息

3

我有以下代码,有时候ArchiveFiles()函数需要更长的时间来完成执行。

当用户从上下文菜单中多次点击退出选项时,如果ArchiveFiles()函数需要更长时间,应用程序将变得无响应。如何在用户再次点击退出选项时显示等待消息?

private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
    ArchiveFiles(); 
    Application.Exit();
}

感谢
Bhaskar

3个回答

5
你可以使用 BackgroundWorker
使用 BackgroundWorker,您将能够在另一个线程上执行诸如您所拥有时间耗尽的任务,以便 UI 不会冻结。您将能够报告该任务的进度,然后报告其完成,并在其完成后执行任何所需逻辑。
处理 BackgroundWorker.DoWork 事件来启动执行可能耗时的工作的操作。
处理BackgroundWorker.ProgressChanged事件以向用户报告异步操作的进度。
最后,处理BackgroundWorker.RunWorkerCompleted事件以实现任务完成后您想要执行的任何逻辑。
请参考以下内容: BackgroundWorker 组件概述 C# BackgroundWorker 教程

4
创建一个新的WaitingForm,并在表单上放置一个图像控件,在该图像控件中使用下面的.gif文件,它会自动播放动画。然后使用以下代码:
  private void exitToolStripMenuItem_Click(object sender, EventArgs e)
  {
     using (var wait = new WaitingForm())
     {
       wait.Show();
       ArchiveFiles(); 
       Application.Exit();
     }
  }

这可能不是最好的解决方案,但它是最快的。如果你想让表单成为对话框,请使用 wait.ShowDialog();,并在其中包含 ArchiveFiles(); Application.Exit(); 函数(如果这是可能的)。

2
你需要异步运行ArchiveFiles,可以使用线程或任务,或者创建一些委托并使用其BeginInvoke方法。
然后,你应该使用一些同步对象,如ManualResetEvent,以便主线程不会继续执行并调用Application.Exit()。 或者你可以使用一些事件来知道操作何时完成,然后再调用Application.Exit()(或在ArchiveFiles中调用它),但我认为这样做更糟糕。

有几种方法可以做到这一点,尽管如果它是非常简单的事情,Teoman的解决方案可能更快地完成。当我回复时,我想到了更复杂的东西,比如显示进度和/或几种类型的资产。 - Neverbirth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接