线程安全多进程

时间:2013-05-09 13:06:16

标签: c# multithreading

我需要多次运行一个进程。每次我调用一个静态方法来实现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();
}

3 个答案:

答案 0 :(得分:2)

这一切都取决于副作用。您的应用程序是线程安全的,因为您只传入字符串对象而您不返回任何内容。因为string是不可变的,并且您不使用任何静态共享成员变量,所以此代码确实单独运行。

唯一的问题是你写入控制台。 Console.WriteLine本身就是线程安全的 只有一个线程可以一次写入stdout。如果您可以接受应用程序的输出混合,那么您已经完成了。

这是应用程序中的线程部分。但是现在也发生了对被调用进程的并发性。如果启动的申请例如总是在%TEMP%中创建一个名为xxx.tmp的文件然后你有一个竞争条件确实发生,因为被调用的可执行文件可以同时启动导致文件使用错误。如果您确定可以安全地同时调用被调用的可执行文件,那么我会说您的代码是线程安全的,您可以根据需要调用它。

答案 1 :(得分:1)

如果它是单独的进程而不是在同一进程中单独的线程,那么您应该考虑使用mutex

答案 2 :(得分:0)

只需创建一个静态锁定对象(或在只有一个方法的情况下锁定该类型)并使用lock()机制。保持线程安全取决于您的实现,而不是TPL。