Я имею дело с выполнением какого-то другого приложения, которое очень нестабильно и много ломает.
Вот моя текущая установка, само выполнение происходит в T:
var threadEndEvent = new ManualResetEventSlim(false);
var executionThread = new Thread(async () =>
{
try
{
await T();
}
catch (Exception x)
{
//deal with exceptions...
}
finally
{
threadEndEvent.Set();
}
}
IТаймер работает по таймауту:
timer.Elapsed += (sender, args) =>
{
var result = Task.Run(() => executionThread.Abort()).Wait(new TimeSpan(0, 0, 30);
//log if aborting was succesful and other info...
threadEndEvent.Set();
}
После этого я делаю это:
executionThread.Start();
threadEndEvent.Wait(timeoutSpan)
В конце концов происходит одна из двух вещей: либо завершается поток, либо, после тайм-аута, он пытаетсяпрервать его, записать в журнал все, что произошло, и двигаться дальше.
В большинстве случаев это работает нормально, однако, когда я запускаю какое-то другое приложение, и оно вылетает, отображая стандартную ошибку, такую как
"exe перестал работать, Windows может проверить в режиме онлайн решение проблемы"
прерывание не происходит, и все зависает.
Я запускаю это приложение в T следующим образом:
var process = new Process
{
StartInfo =
{
//Specify path to exe, arguments, etc...
}
};
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();
Я знаю, что WaitForExit
является блокировкой потока, но выполняется в отдельном потоке executionThread
, поэтому я не уверен, почему выполнение зависает.
Что мне здесь не хватает?Как мне сделать так, чтобы он продолжал работать после истечения времени ожидания независимо от того, что происходит?