Не удается продолжить выполнение кода, когда приложение в отдельном потоке падает - PullRequest
0 голосов
/ 23 декабря 2018

Я имею дело с выполнением какого-то другого приложения, которое очень нестабильно и много ломает.

Вот моя текущая установка, само выполнение происходит в 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, поэтому я не уверен, почему выполнение зависает.

Что мне здесь не хватает?Как мне сделать так, чтобы он продолжал работать после истечения времени ожидания независимо от того, что происходит?

1 Ответ

0 голосов
/ 21 января 2019

В конце концов нашел решение.К сожалению, отладчик не работает должным образом, поэтому детали будут очень расплывчатыми.

Как только я начал копать глубже, я обнаружил, что T работает так:

var executingThread = new Thread(()=>{
//process code mentioned in question...
});
executingThread.Start();
executingThread.Join();

Не уверенпочему это так, я имею дело с недокументированным унаследованным кодом.

В любом случае, после удаления кода дополнительного потока исключения корректно перехватываются и ничего не зависает.

Не знаю почемуТочное создание дополнительного потока делает исключения неуловимыми (никогда не видел этой проблемы, когда этот код запускался на .NET Framework), но если вы сталкиваетесь с подобной проблемой, это может быть решением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...