我需要多次运行一个进程。每次我调用一个静态方法来实现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();
}
答案 0 :(得分:2)
这一切都取决于副作用。您的应用程序是线程安全的,因为您只传入字符串对象而您不返回任何内容。因为string是不可变的,并且您不使用任何静态共享成员变量,所以此代码确实单独运行。
唯一的问题是你写入控制台。 Console.WriteLine本身就是线程安全的 只有一个线程可以一次写入stdout。如果您可以接受应用程序的输出混合,那么您已经完成了。
这是应用程序中的线程部分。但是现在也发生了对被调用进程的并发性。如果启动的申请例如总是在%TEMP%中创建一个名为xxx.tmp的文件然后你有一个竞争条件确实发生,因为被调用的可执行文件可以同时启动导致文件使用错误。如果您确定可以安全地同时调用被调用的可执行文件,那么我会说您的代码是线程安全的,您可以根据需要调用它。
答案 1 :(得分:1)
如果它是单独的进程而不是在同一进程中单独的线程,那么您应该考虑使用mutex。
答案 2 :(得分:0)
只需创建一个静态锁定对象(或在只有一个方法的情况下锁定该类型)并使用lock()机制。保持线程安全取决于您的实现,而不是TPL。