我有以下代码,有时ArchiveFiles()需要更多时间来完成执行。
当用户从上下文菜单中多次单击退出选项时,如果ArchiveFiles()需要更多时间,应用程序将无响应。如何再次单击退出选项时显示等待消息?
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
ArchiveFiles();
Application.Exit();
}
感谢
巴斯卡尔
答案 0 :(得分:5)
您可以使用BackgroundWorker。
使用BackgroundWorker
,您将能够执行耗时的任务,例如您在另一个线程上拥有的任务,以便UI不会冻结。您将能够报告该任务的进度,然后报告其完成情况并在完成后执行您需要的逻辑。
处理BackgroundWorker.DoWork事件以启动执行可能耗时的工作的操作。
处理BackgroundWorker.ProgressChanged事件以向用户报告异步操作的进度。
最后,处理BackgroundWorker.RunWorkerCompleted事件以在任务完成后实现您想要实现的任何逻辑。
请参阅以下内容:
答案 1 :(得分: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 :(得分:2)
您必须异步运行ArchiveFiles
,方法是使用thread
或任务,或者使用delegate
方法制作一些BeginInvoke
。
您应该使用一些同步对象,如ManualResetEvent
,这样主线程就不会继续执行,调用Application.Exit()
。或者您可以使用某个事件来了解操作何时完成,然后调用Application.Exit()
(或在ArchiveFiles
内调用它),但我发现情况会更糟。