2009-05-04 3 views
1

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

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

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

ТИА Martin

ответ

1

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

А «безопаснее» метод должен иметь работник вызов Interrupt - это поднимет в потоке пользовательского интерфейса в ThreadInterruptedException, но только тогда, когда он находится в WaitSleepJoin состоянии - если поток никогда не спит он не будет прерывать, но, по крайней мере, он не повесит и не испортит память.

0

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

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

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

0

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^