以下のコードの問題が何であるかはわかりませんが、期待どおりに動作しません。設計は、ユーザーが 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();
}
}
私が抱えている3つの主な問題:
- ジョブが常に正しい順序で開始されるとは限りません (ListBox の下位にあるいくつかの項目は、上位にある他の項目よりも前に開始されます)
- 開始されたプロセスが、完了したにもかかわらずウィンドウが画面に残っているかのように停止しているように見えることがあります。これはかなり一貫した問題ですが、常に同じタスク/入力ファイルが停止するわけではありません。以前のテストで問題なく機能していたものが、失速したり、逆の場合もあります。
- コードのこの部分のテスト中にラップトップが再起動しますか??
フィードバック、リンク、例をいただければ幸いです。