0

プロセスを複数回実行する必要があります。と のオブジェクトを実装する静的メソッドを呼び出すたびProcessProcessStartInfo. ProcessStartInfoプロパティは、エラーまたは出力を返すように変更されました。Parallel.Forループ内で静的メソッドを呼び出すことは可能ですか? これに関連するスレッドセーフに関するドキュメントは見つかりませんでした。

public static void Run(string item1, string item2, string item3, string item4)
{
        var ProcInfo = new ProcessStartInfo(Program.exe,(item1+item2+item3+item4));
        ProcInfo.CreateNoWindow = true;
        ProcInfo.UseShellExecute = false;
        ProcInfo.WorkingDirectory = Environment.CurrentDirectory;

        ProcInfo.RedirectStandardError = true;

        var process = Process.Start(ProcInfo);
        process.WaitForExit();

        string error = process.StandardError.ReadToEnd();
        int exitCode = process.ExitCode;

            Console.WriteLine("error>>" + (String.IsNullOrEmpty(error) ? "(none)" : error));
            Console.WriteLine("ExitCode: " + exitCode, "ExecuteCommand");
            process.Dispose();
}
4

3 に答える 3

2

それはすべて副作用に依存します。文字列オブジェクトのみを渡し、何も返さないため、アプリケーションはスレッドセーフです。文字列は不変であり、静的共有メンバー変数を使用しないため、このコードは分離して実行されます。

唯一の問題は、コンソールに書き込むことです。Console.WriteLine は、一度に 1 つのスレッドのみが stdout に書き込むことができるスレッド セーフです。アプリケーションの出力が混同されることを許容できれば、それで完了です。

それは、アプリケーション内のスレッド部分でした。しかし、呼び出されたプロセスに対して並行処理が行われるようになりました。たとえば、開始されたアプリケーションが常に %TEMP% に xxx.tmp という名前のファイルを作成する場合、呼び出された実行可能ファイルが同時に開始され、使用中のファイル エラーが発生するため、競合状態が発生します。呼び出された実行可能ファイルを同時に安全に呼び出すことができると確信している場合、コードはスレッドセーフであり、好きな数のスレッドから呼び出すことができます。

于 2013-05-09T13:54:32.947 に答える
1

別々のプロセスであり、同じプロセス内の別々のスレッドではない場合は、ミューテックスの使用を検討する必要があります。

于 2013-05-09T13:13:35.233 に答える