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 本身是线程安全的,一次只有一个线程可以写入标准输出。如果您可以忍受应用程序的输出确实会混淆,那么您已经完成了。

那是您的应用程序中的线程部分。但是现在被调用的进程也发生了并发。例如,如果启动的应用程序总是在 %TEMP% 中创建一个名为 xxx.tmp 的文件,那么您就会出现竞争条件,因为调用的可执行文件可以同时启动,从而导致文件使用中的错误。当您确定可以安全地同时调用被调用的可执行文件时,我会说您的代码是线程安全的,您可以从任意数量的线程中调用它。

于 2013-05-09T13:54:32.947 回答
1

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

于 2013-05-09T13:13:35.233 回答
0

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

于 2013-05-09T13:22:52.700 回答