【问题标题】:How to wait for a task to finish如何等待任务完成
【发布时间】:2013-10-30 08:58:32
【问题描述】:

我有一个 Windows 窗体,我有一个报告正在导出为 PDF 格式。

生成报告后,我希望完全终止应用程序。我添加了一个Application.Exit() 子句,但是这有时会在导出仍在进行时关闭进程。

因此,我只想在导出完成后关闭应用程序。

我尝试了以下方法:

   while(true) 
   {
    if (Process.GetCurrentProcess().WaitForInputIdle())
    {
        Application.Exit();
    }
   }

还有:

while(true) 
{
    if (Process.GetCurrentProcess().Responding)
    {
        Application.Exit();
    }
}

但是没有任何工作 - 应用程序有时仍会在导出完成之前关闭。

我做错了什么?

【问题讨论】:

  • 它不是Task,如Task 类,而是一个任务,如工作。
  • 是的,我指的是逻辑意义上的任务。
  • 不要检查当前进程...启动一个子进程,并让主进程等待它完成后再退出。
  • 抱歉,问题误解了
  • 显示开始导出的代码;这可能有助于我们告诉您如何等待它——也许这是不可能的。

标签: c# .net windows multithreading process


【解决方案1】:

您可以在另一个进程中开始导出并等待它完成(查看相关帖子:Wait till a process ends)。

如果你不想这样,你可以检查导出完成的文件是否存在以及它是否被锁定(查看Wait Until File Is Completely Written)。

【讨论】:

  • 此答案假定等待的应用程序在导出后实际退出。你没有提到它。
【解决方案2】:

问题在于,如果应用程序旨在响应用户交互,那么即使应用程序仍在运行,两种方式都会关闭应用程序。

也许您应该监控应用程序的输出?即:如果存在 PDF 文件,则该过程完成。或者更确切地说:如果 PDF 文件存在并且 15 秒内没有被修改过,请退出应用程序。

【讨论】:

  • 我想尽可能避免延迟,因为我需要应用程序尽可能快 - 因此希望在导出完成后立即退出。
  • 是的,但无法知道应用程序何时从“外部”完成。
  • 所以不可能简单地检查进程是否处于空闲状态或类似的状态?正如我想象的那样,一旦导出完成,该过程将处于空闲状态,因为没有其他工作需要处理。
  • "Idle" 表示没有待处理的窗口消息。应用程序可能仍然很忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多