Как НЕ ждать выхода с помощью Impersonataion.RunProcess в C#/ASP.NET
То, что я хочу знать, есть ли способ НЕ ждать процесса при использовании олицетворения. Там нет перегрузок, поэтому я не уверен, как это сделать.
// always waits for exit to continue
Impersonation.RunProcess(someProcessPath);
Причина, по которой я хочу это сделать, заключается в том, что у меня есть долго выполняющееся приложение, которое обрабатывает большие файлы, но я хочу доставить клиенту ответ об успешном завершении процесса, прежде чем перенаправить их на страницу состояния. Я не могу запустить процесс с обычным process.Start(), потому что IUSER должен олицетворять учетную запись пользователя с повышенными правами.
Я даже пытался использовать process.StartInfo после Impersonation.Login() и указывать un/pass, но я думаю, что статус "залогинен" является частью только статического класса Impersonation.
if (Impersonation.Logon(LoginCredentials.UserName, LoginCredentials.Password))
{
// this fails with an invalid privileges exit code
process.StartInfo.FileName = path;
process.StartInfo.UseShellExecute = false;
process.StartInfo.UserName = "Administrator";
SecureString secString = new SecureString();
foreach( char c in "mypassword" )
secString.AppendChar( c );
process.StartInfo.Password = secString;
process.StartInfo.Verb = "runas";
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.Start();
}
Я нашел миллионы сообщений о том, как ждать завершения нормально вызванного процесса, прежде чем продолжать использовать Process.WaitForExit(). Я также успешно проигнорировал выход, используя process.start() сам по себе в консольных приложениях (уже прошедших проверку подлинности).
2 ответа
Вы можете разветвлять его в другой поток:
// using ThreadPool for long running tasks is discouraged so create a new thread
var t = new Thread(() => Impersonation.RunProcess(someProcessPath)) { IsBackground = true };
t.Start();
Вы можете установить некоторые флаги внутри метода потока, чтобы указать, когда он был вызван и когда он закончился.
Impersonation.RunProcess("/path/to/cmd.exe /C start "+someProcessPath);
Это вернется, когда cmd.exe заканчивается, что после запуска someProcessPath