Как НЕ ждать выхода с помощью 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

Другие вопросы по тегам