2013-05-09 114 views
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(); 
} 
+0

请添加相关代码 – nmat 2013-05-09 13:11:38

+0

发布您的代码...不太可能有什么阻止您调用它(尽管是否合理是另一个问题)。但是如果没有看到代码,就无法确定。 – 2013-05-09 13:12:46

+0

你在说什么'ProcessInfo'类? 'System.Diagnostics'中没有这样的事情。看看你的课程的文档。 (例如,http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx)。在“线程安全”的底部,通常会说“任何公共静态(Visual Basic中的Shared)成员都是线程安全的,任何实例成员都不能保证线程安全。 – 2013-05-09 13:26:46

回答

1

如果它是独立的过程而不是同一个进程中分离线程,你应该看看使用mutex

+0

我看不到你的答案符合OP的要求。 – Marco 2013-05-09 13:30:31

+0

@Marco问题*出现*与跨进程同步有关。如果OP更新和澄清*确切*他们问什么,我可以改进我的答案,但是,因为它的立场我的答案是没有比你自己的相关。 – James 2013-05-09 13:38:52

+0

够公平,让我们看看OP说的是什么 – Marco 2013-05-09 13:43:59

0

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

2

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

唯一的问题是你写到控制台。 Console.WriteLine本身是线程安全的 只有一个线程可以一次写入标准输出。如果你可以活下去,你的应用程序的输出结果混合起来,那么你已经完成了。

这是您的应用程序内的线程部分。但是,被调用的进程现在还有并发性。如果已启动的应用程序通常会在%TEMP%中创建一个名为xxx.tmp的文件,然后就会出现竞争条件,因为被调用的可执行文件可能会同时启动,从而导致文件发生使用错误。当你确定被调用的可执行文件可以被安全地同时调用时,那么我会说你的代码是线程安全的,你可以调用它的形式尽可能多的线程,只要你喜欢。