2013-05-09 170 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的文件,然後就會出現競爭條件,因爲被調用的可執行文件可能會同時啓動,從而導致文件發生使用錯誤。當你確定被調用的可執行文件可以被安全地同時調用時,那麼我會說你的代碼是線程安全的,你可以調用它的形式儘可能多的線程,只要你喜歡。