Использование systemdiagnostics.process для запуска фоновых заданий в Powershell - PullRequest
2 голосов
/ 07 июля 2010

Я знаю, что в Powershell есть фоновые функции с Start-Job, Wait-Job и т. Д., Но возможно ли использовать класс Process из System.Diagnostics в .Net для достижения того же?Если это так, что будет лучшим способом сделать это / какие преимущества он будет иметь по сравнению со стандартным механизмом Powershell для выполнения фоновых заданий?

Ответы [ 2 ]

2 голосов
/ 07 июля 2010

Вы, безусловно, можете использовать объект Process, чтобы «запустить» исполняемый файл асинхронно, а с помощью возвращаемого объекта процесса вы можете проверить, выполнен ли EXE, или уничтожить процесс.Хитрость заключается в том, чтобы получить информацию о выходе и потоке ошибок обратно, не мешая работе консоли, пока программа работает, так что вы можете делать другие вещи.Из документов MSDN похоже, что использование BeginOutputReadLine может помочь:

// Start the child process.
 Process p = new Process();
 // Redirect the output stream of the child process.
 p.StartInfo.UseShellExecute = false;
 p.StartInfo.RedirectStandardOutput = true;
 p.StartInfo.FileName = "Write500Lines.exe";
 p.Start();
 // Do not wait for the child process to exit before
 // reading to the end of its redirected stream.
 // p.WaitForExit();
 // Read the output stream first and then wait.
 string output = p.StandardOutput.ReadToEnd();
 p.WaitForExit();

Хотя, если вы хотите использовать фоновое поведение, вам нужно выполнить StandardOutput.ReadToEnd () в фоновом потоке изатем создайте механизм для извлечения этого вывода из основного потока консоли, что кажется большой работой, и в настоящее время я могу думать о любых преимуществах по сравнению с фоновыми заданиями PowerShell.

Другой подход заключается в создании пространства выполнения для выполненияработа bg, как указывает это сообщение в блоге Джима Трухера .

0 голосов
/ 07 июля 2010

Это не элегантно или хорошо документировано.Он создает объект System.Diagnostic.Process и выполняет некоторые общие инициализации для него.Получив объект Process, вы можете выполнить дополнительные настройки для него, а затем вызвать Process.Start для запуска процесса.

...