不确定我下面的代码有什么问题,但没有按预期工作。设计是允许用户从 ListBox 中选择任意数量的输入文件,然后单击“执行”按钮以使用不同的输入文件启动相同的可执行文件。我将添加一个控件以允许用户指定并发进程的数量,但现在我将硬编码为 3 以进行测试。我的期望是每个可执行文件都将按顺序开始(尽管我知道它们可能不会以这种方式完成)并且一次只会执行 3 个(尽管这个数字最终将由用户输入控件控制)。我想为调用进程的函数增加额外的功能,即任务优先级,返回退出代码,但现在我无法让基本功能正常工作。我尝试了许多代码变体 已在此站点和网络上的其他站点上找到,但仍无法使其正常工作。这是当前版本:
private void btnParserExe_Click(object sender, EventArgs e)
{
Pool = new Semaphore(3,3); //Pool above declared as class variable
string ExeName = "C:\\Program Files (x86)\\Norman\\bin\\OC2.exe";
string Args;
string ArgDir = this.dirListBox1.Path + "\\";
for (int i = 0; i < this.fileListBox1.Items.Count; i++)
{
if (this.fileListBox1.GetSelected(i) == true)
{
Args = "-i " + this.fileListBox1.get_Items(i) + " -r -c -noerr";
Thread thread = new Thread(() => DoWork(ArgDir, ExeName, Args, "3"));
thread.Start();
}
}
}
private static void DoWork(string WorkingDir, string exefile, string parameters, string priority)
{
Pool.WaitOne();
Process exeProcess = new Process();
int exitCode;
try
{
exeProcess.StartInfo.FileName = exefile;
exeProcess.StartInfo.Arguments = parameters;
exeProcess.StartInfo.WorkingDirectory = WorkingDir;
exeProcess.Start();
exeProcess.WaitForExit();
}
catch (Exception ex)
{
MessageBox.Show("ERROR EXECUTING: " + parameters + " " + ex.Message);
}
finally
{
exitCode = exeProcess.ExitCode;
}
Pool.Release();
}
}
我遇到的三个主要问题:
- 作业并不总是以正确的顺序开始(ListBox 中较低的某些项目在较高的其他项目之前启动)
- 有时启动的过程似乎停止了,好像它已经完成但窗口仍然在屏幕上。这是一个非常一致的问题,但并不总是相同的任务/输入文件会停止。有时,在先前的测试中运行良好的会停止运行,反之亦然。
- 我的笔记本电脑在测试这部分代码时重新启动??
任何反馈、链接、示例将不胜感激。