【问题标题】:Running a process inside a worker thread (C#)在工作线程中运行进程 (C#)
【发布时间】:2013-04-17 09:00:48
【问题描述】:

我正在尝试从我的应用程序内部运行多个外部应用程序。假设我想运行一个名为 LongtimeRun.exe 的应用程序 10 次,每次运行此应用程序,大约需要 30 秒才能完成(总时间为 300 秒或 5 分钟!)。我还想给用户一些进度指示(例如应用程序运行了多少次)。

我可以创建一个批处理文件并在那里运行 LongTimeRun.exe 10 次,但是我无法显示任何进度报告。

我有这个有效的代码:

using System.Diagnostics;
using System.IO;

public class CommandProcessor
{
        private readonly string binDirectory;
    private readonly string workingDirectory;
    public CommandProcessor(string workingDirectory, string binFolderName)
    {
        binDirectory = Path.Combine(FileSystem.ApplicationDirectory, binFolderName);
        this.workingDirectory = workingDirectory;
    }
    public int RunCommand(string command, string argbase, params string[] args)
    {
        var commandPath = Path.Combine(binDirectory, command);
        var formattedArgumets = string.Format(argbase, args);

        var myProcess = new Process();
        myProcess.EnableRaisingEvents = false;
        myProcess.StartInfo.FileName = commandPath;
        myProcess.StartInfo.Arguments = formattedArgumets;
        myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        myProcess.StartInfo.WorkingDirectory = this.workingDirectory;
        myProcess.Start();
        myProcess.WaitForExit();
    }
}

当我这样称呼它时:

private void RunCommands()
{
  var command = "LongRunCommand.exe";
  string binDirectory = Path.Combine(FileSystem.ApplicationDirectory, binFolderName);
  var cp = new CommandProcessor(this.workingDirectory, binDirectory);
  for(int i=0;i<10;i++)
  {
       cp.RunCommand(Command, "-i {0}", i);
  }
 }   

上述代码作为直接调用的一部分被调用并阻塞了应用程序(应用程序似乎在此过程中挂起。

为了解决挂起的问题,我使用了如下的后台工作者:

   var worker = new BackgroundWorker();
   worker.DoWork += this.WorkerDoWork;
   worker.RunWorkerCompleted += this.workerRunWorkerCompleted;
   worker.RunWorkerAsync();

并在 WorkerDoWork 中调用 runco​​mmand。

现在应用程序在调用此行后退出:

 myProcess.WaitForExit();

没有调试信息,退出代码为-1。

问题是什么,如何解决?

有没有更好的方法可以在不使用 BackgroundWorker 的情况下实现我的目标?

【问题讨论】:

    标签: c# shell cmd


    【解决方案1】:

    您遇到的问题是因为您的 BackgroundWorker 线程仍在运行,但您的应用程序完成了它的生命周期并结束(它没有被它们阻塞,因此它的路径很清楚结束)因此杀死了这些线程。

    您需要在后台线程仍在运行时通知应用程序退出。您可以有一个计数器,在每个线程启动时递增,然后在它们完成时递减计数器。

    在您的主应用程序线程中,您可以等到计数器达到零后再结束应用程序。

    显然,您需要考虑锁定(即两个线程同时尝试递减计数器),但这应该给您一个入门。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 2019-04-06
      • 2021-12-07
      • 2013-01-24
      • 1970-01-01
      相关资源
      最近更新 更多