john1990_1 Ответов: 2

Почему невозможно запустить таймер из фонового потока?


То же самое касается backgroundworker.runworkerasync.

У меня была эта проблема, и я решил ее, запустив таймер в BackgroundWorker.RunWorkerCompleted. потому что он находится на той же нити, что и основной.

Что я уже пробовал:

Мне это удалось, как было сказано выше, но я не понимаю, в чем проблема?

Philippe Mori

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

john1990_1

Я сделал timer1. start () в строках потока, работающего в фоновом режиме, код выполнялся в фоновом режиме, но таймер, который находится на пользовательском интерфейсе в форме, не запускался.

thread1.IsBackground=true;
thread1.начать();

2 Ответов

Рейтинг:
8

lukeer

Как писал OriginalGriff, Система.Окна.Формы.Таймер это компонент пользовательского интерфейса. Обычно вы получаете его в своем приложении, перетаскивая его на Форма.
Но вы можете создать его в коде, как вы сделали бы это с каждым обычным классом. Из любой нити, которая вам нравится. Затем вы можете вызвать его из этого потока.

Но я бы скорее посоветовал оставить эти таймеры в потоке пользовательского интерфейса, потому что есть альтернативные варианты, предназначенные для использования в других трэдах: Система.Таймеры.Таймер и Система.Нарезание резьбы.Таймер.

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

По сути, вам придется решить, где использовать invoke: вызовы в таймер (если он находится в потоке пользовательского интерфейса) или из таймера в поток пользовательского интерфейса.


johannesnestler

5ed-но я бы всегда предлагал маршалить поток пользовательского интерфейса из таймера, а не наоборот. То, что ОП хотел иметь таймер в фоновом потоке, является сильным намеком на то, что он хотел использовать что-то вроде системы.Таймеры.Таймера, но не знал об этом...

lukeer

Полное Подтверждение. И спасибо.

Рейтинг:
2

OriginalGriff

Просто: это элемент управления, что означает, что это компонент пользовательского интерфейса (даже если он не виден), и они могут быть доступны только в потоке пользовательского интерфейса. Теоретически вы могли бы вызвать его, чтобы запустить (поскольку Invoke перемещает код в поток пользовательского интерфейса), но это, вероятно, нарушит цель BackgroundWorker!