我的C#程序运行一个进程,当单击特定按钮时,该进程启动一个命令提示符应用程序,并向其传递参数。
程序从用户选择中获取目录路径,并检查它是否为空。
如果它不为空,则 foreach 循环将循环遍历目录中每个文件的完整路径数组。它还会将进度条设置为 0 并准备好进行增量
当它循环时,它将运行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 };每次创建的每个进程都会运行?
很确定您遇到了变量捕获问题,请在委托中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)
| 归档时间: |
|
| 查看次数: |
1273 次 |
| 最近记录: |