【问题标题】:Wait til background worker finishes before calling method在调用方法之前等待后台工作人员完成
【发布时间】:2013-04-19 23:37:26
【问题描述】:

我有一个复制一些文件的后台工作人员。完成文件复制后,我想启动一个应用程序。我遇到的问题是,在复制文件时,它会调用代码来启动应用程序,因此会遇到文件正在使用错误。是否可以进行检查以确保仅在后台工作人员完成时才调用某个方法?

private void LaunchApplication(string targetPath, string targetExecutable)
    {
            CopyFiles();

            Process.Start(Path.Combine(targetPath, targetExecutable));
    }

CopyFiles 在 BackGroundWorker 的 DoWork 方法中被调用。我希望这在 Process.Start... 被调用之前完全完成。现在我有几个可执行文件绑定到几个按钮,所以我不能把 Process.Start... 放在 RunWorkerCompleted 事件中。

【问题讨论】:

  • 你在使用RunWorkerCompleted事件吗?
  • 您可以在运行应用程序之前检查文件是否已复制。
  • @DGibbs - 是的,但问题是我有几个可以启动的应用程序,在用户单击其中一个启动按钮之前我无法确定是哪一个。
  • @SamLeach - 我如何确定这一点?
  • @Xaisoft 我不确定我是否理解......如果工作人员不完整,你不能阻止按钮执行任何操作吗?

标签: c# winforms backgroundworker


【解决方案1】:

如果您将CopyFiles() 放在后台线程中,则将执行下一行代码,因此在您的情况下,我将使用后台工作人员。相反,我会阻止直到复制文件完成,然后启动应用程序。设置某种窗口,告诉您的用户稍等。

如果您需要等待并且仍然使用后台工作程序,那么 CopyFiles() 应该在 DoWork 处理程序中,Process.Start 应该是 BackgroundWorker.RunWorkerCompleted 事件。

MSDN on RunWorkerCompleted

RunWorkerCompleted

已完成的堆栈溢出示例:

Run Worker Completed Sample Code

此外,您可以创建一个全局互斥锁以确保一次只发生一次启动,因此如果您启动多次,则只会处理一次。

Stack Overflow Global Mutex Question

【讨论】:

  • 将 Process.Start 放入 RunWOrkerCompleted 时遇到的问题是大约有 6 个按钮可以启动不同的应用程序,我不知道用户点击了哪个按钮。
  • @Xaisoft - 您可以为每个按钮添加点击处理程序,或者为所有按钮添加一个处理程序。处理程序将传递一个“对象发送者”参数。将其转换为 Button,如果您使用通用处理程序方法,您可以找到按钮的名称。
  • 那么你是在按下按钮时复制文件还是只打开exe?如果您正在复制文件,那么您可以将可执行路径作为参数传递给后台工作人员。如果您只是在单击按钮时打开 exe,那么只需检查后台工作人员是否正忙于bgw.IsBusy
猜你喜欢
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多