C# 线程安全多进程

C# 线程安全多进程,c#,multithreading,C#,Multithreading,我需要多次运行一个进程。每次我调用一个静态方法来实现Process和ProcessStartInfo中的对象时。ProcessStartInfo属性已修改为返回错误或输出。是否可以在Parallel.For循环中调用静态方法?我找不到任何与此相关的关于线程安全的文档 public static void Run(string item1, string item2, string item3, string item4) { var ProcInfo = new ProcessS

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

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

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

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

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

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

唯一的问题是您确实要写入控制台。Console.WriteLine本身是线程安全的 一次只能有一个线程写入标准输出。如果你能活下来,你的应用程序的输出确实被弄混了,那么你已经完成了


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

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

唯一的问题是您确实要写入控制台。Console.WriteLine本身是线程安全的 一次只能有一个线程写入标准输出。如果你能活下来,你的应用程序的输出确实被弄混了,那么你已经完成了


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

发布你的代码。。。不太可能有任何东西阻止你这样称呼它(尽管这是否明智是另一个问题)。但是如果没有看到代码,就不可能确定。你在说什么
ProcessInfo
类?在
系统诊断中没有这样的东西。请查看您的课程文档。(例如,)。在“线程安全”下的底部,它通常会说“此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。不保证任何实例成员都是线程安全的。”发布您的代码。。。不太可能有任何东西阻止你这样称呼它(尽管这是否明智是另一个问题)。但是如果没有看到代码,就不可能确定。你在说什么
ProcessInfo
类?在
系统诊断中没有这样的东西。请查看您的课程文档。(例如,)。在“线程安全”下的底部,它通常会说“此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全的。任何实例成员都不能保证是线程安全的。”我看不出你的答案符合OP的要求。@Marco这个问题似乎与跨进程同步有关。如果OP更新并澄清了他们所问的内容,我可以改进我的答案,但是,从目前的情况来看,我的答案与您自己的答案的相关性不亚于您自己的答案。公平地说,让我们看看OP所说的内容。我看不出您的答案与OP所问的内容相符。@Marco这个问题似乎与跨进程同步有关。如果OP更新并澄清了他们到底在问什么,我可以改进我的答案,但是,从目前的情况来看,我的答案与你的答案的相关性不亚于你自己的答案。公平地说,让我们看看OP是怎么说的