尝试在进程退出时运行代码 C#

adb*_*ads 2 .net c#

我的C#程序运行一个进程,当单击特定按钮时,该进程启动一个命令提示符应用程序,并向其传递参数。

  1. 程序从用户选择中获取目录路径,并检查它是否为空。

  2. 如果它不为空,则 foreach 循环将循环遍历目录中每个文件的完整路径数组。它还会将进度条设置为 0 并准备好进行增量

  3. 当它循环时,它将运行cli-taskusing Process

问题是:完成循环文件的任务后,我希望它删除该文件并增加进度条。

如果像这样一一进行的话,效果很好:

process.WaitForExit(10000);
File.Delete(fileName);
progressBar1.Increment(1);
Run Code Online (Sandbox Code Playgroud)

但该程序非常慢。因为它会等待每个进程完成后再开始下一个进程。

所以我尝试了下面的代码:

string[] files = Directory.GetFiles(label1.Text);

if (files.Length != 0)
{
    progressBar1.Value = 0;
    progressBar1.Minimum = 0;
    progressBar1.Maximum = files.Length;

    foreach (string fileName in files)
    {
        System.Diagnostics.Process process = new System.Diagnostics.Process();
        System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
        //startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
        startInfo.FileName = @"C:\Program Files\cli-tool\cli.exe";
        startInfo.Arguments = "-i " + "\"" + fileName + "\"" + " -o " + "\"" + label2.Text + "\\" + Path.GetFileName(fileName) + "\"" + " -s -t";
        process.StartInfo = startInfo;
        process.EnableRaisingEvents = true;
        process.Start();
        process.Exited += delegate
        {
            File.Delete(fileName);
            progressBar1.Increment(1);
        };
    }
Run Code Online (Sandbox Code Playgroud)

不幸的是,当我以这种方式运行它时,它会在到达该File.Delete(fileName)部分时使程序崩溃,但原始process.start任务有效,但它能够删除退出它的第一个进程的第一个文件。

Visual Studio的调试控制台中显示以下错误:

System.Windows.Forms.dll 中发生“System.InvalidOperationException”类型的第一次机会异常程序“[3308] IonicFolderProtector.vshost.exe:托管 (v4.0.30319)”已退出,代码为 0 (0x0)。

我无法确定这段代码有什么问题。我是否错误地认为process.Exited += delegate { // some code };每次创建的每个进程都会运行?

Sco*_*ain 5

很确定您遇到了变量捕获问题,请在委托中var temp = filename;放入foreachthen do 。File.Delete(temp);

foreach (string fileName in files)
{
    var temp = fileName;
    System.Diagnostics.Process process = new System.Diagnostics.Process();
    System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
    //startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    startInfo.FileName = @"C:\Program Files\cli-tool\cli.exe";
    startInfo.Arguments = "-i " + "\"" + fileName + "\"" + " -o " + "\"" + label2.Text + "\\" + Path.GetFileName(fileName) + "\"" + " -s -t";
    process.StartInfo = startInfo;
    process.EnableRaisingEvents = true;
    process.Start();
    process.Exited += delegate
    {
        File.Delete(temp);
        progressBar1.Increment(1);
    };
}
Run Code Online (Sandbox Code Playgroud)

这将确保实际删除的是正确的文件。您可能还需要调用 forprogressBar1.Increment()因为我不知道该事件是否将在 UI 线程上运行。

    process.Exited += delegate
    {
        File.Delete(temp);
        progressBar1.Invoke(new Action(() => progressBar1.Increment(1)));
    };
Run Code Online (Sandbox Code Playgroud)