тайм-аут для метода в потоке пользовательского интерфейса

StackOverflow https://stackoverflow.com/questions/819466

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня проблема в том, что я создаю экземпляр объекта в UI-thread (WinForms).Создание этого объекта, вероятно, занимает очень много времени, и я хотел бы иметь какой-то "тайм-аут" для этого метода (потому что он блокирует мое приложение).

Проблемы, с которыми я сталкиваюсь, заключаются в следующем:1.объект должен быть создан в потоке пользовательского интерфейса 2.объект является посторонним объектом, и у меня нет доступа к исходному коду, поэтому я не могу его изменить.

Итак, у меня был бы вопрос, если у кого-то есть творческая идея, возможно ли создать логику, которая останавливает выполнение метода при достижении тайм-аута?

тиа Мартин

Это было полезно?

Решение

Вот плохое решение.Используйте рабочий поток по таймеру для мониторинга потока пользовательского интерфейса.Если таймер истечет до создания объекта, вызовите рабочий поток Abort в потоке пользовательского интерфейса.Это вызовет ThreadAbortException в потоке пользовательского интерфейса, который вы должны перехватить.Причины, по которым это плохо, заключаются в том, что вы можете привести к зависанию или аварийному завершению работы вашей программы в зависимости от точного времени и условий гонки при возникновении исключения.

"Более безопасный" метод заключается в том, чтобы вызвать worker Interrupt - это вызовет ThreadInterruptedException в потоке пользовательского интерфейса, но только тогда, когда он находится в WaitSleepJoin состояние - если поток никогда не переходит в спящий режим, он не прерывается, но, по крайней мере, он также не зависает и не повреждает память.

Другие советы

Не совсем; особенно если у вас нет доступа к источнику.

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

Обязательно ли это должно быть то же самое Поток пользовательского интерфейса?Вы могли бы создать второй поток пользовательского интерфейса для владения этим кодом?Это получает маленький неровный, но может сработать.

если вы используете BeginInvoke, то IAsyncResult - результат имеет дескриптор ожидания, по которому вы можете WaitOne (тайм-аут) - из потока, отличного от пользовательского интерфейса.

К сожалению, по истечении времени ожидания нет чистого способа отменить этот BeginInvoke, поэтому вы можете попробовать 1800 INFORMATIONэто решение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top