Как отключить тайм-аут в приложении WPF C#? - PullRequest
0 голосов
/ 12 февраля 2020

Приложение, над которым я работаю, закрывается при закрытии. Приложение включает в себя собственный код C ++, загруженный из динамических c библиотек.

Собственный код начинает очистку через поток финализатора G C, когда его главный контейнер (который является классом CLR) удаляется G C.

После того, как я много копал, я обнаружил, что это связано только со временем - если я добавлю Sleep(10000) к одной из встроенных функций очистки, которые запускаются при закрытии приложения, оно вызовет sh. По сути, это происходит потому, что вся нативная часть имеет проверку, которая в основном выглядит следующим образом:

// native library destruction
~MyEntireDll()
{
  if(!EverythingProperlyCleanedUp())
  {
    log("Killed without proper cleanup.");
    CrashOnPurpose();
  }
}

Коллега предположил, что это потому, что когда вы нажимаете кнопку закрытия в WPF, он сигнализирует о завершении потоков, и если они не делают это в установленное количество времени, это убивает их трудным путем. Это означает, что когда наша собственная часть программы занимает много времени для очистки, она уничтожается, но после такого уничтожения деструкторы глобальных объектов по-прежнему вызываются.

Мы не хотим, чтобы она была уничтожена без правильная очистка в любом случае - тот факт, что мы выяснили это благодаря преднамеренному cra sh, описанному выше, является хорошей вещью.

Мой вопрос: где мне установить, как долго ждать, прежде чем уничтожать фоновые потоки? Могу ли я отключить эту функцию и иметь свой собственный способ борьбы с зависаниями? Я ничего не нашел в документации, на самом деле я вообще не нашел упоминания об истечении времени ожидания.

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