Запустите / остановите DispatcherTimer из другого потока

#c# #silverlight #windows-phone-7 #silverlight-4.0 #windows-phone-7.1

#c# #silverlight #windows-phone-7 #silverlight-4.0 #windows-phone-7.1

Вопрос:

Вот мой код..

 public DispatcherTimer tmr = new DispatcherTimer();

void somefunction (parameters){

if (something)
  tmr.Start();
if (something else)
  tmr.Stop();

   }
  

Моя проблема в том, что я не могу получить доступ к методам запуска / остановки объекта tmr из второй функции, поскольку она выполняется в другом потоке!!!

Кто-нибудь, пожалуйста, может мне помочь?? Я поражен этой проблемой почти 3 дня! 🙁

Ответ №1:

Вам нужно вызвать его через Dispatcher (для маршалинга вызова из другого потока) следующим образом

 Deployment.Current.Dispatcher.BeginInvoke((Action)(()=>timer.Start())
  

Комментарии:

1. спасибо, хасан .. но поскольку «tmr» уже является объектом DispatcherTimer, в нем нет метода Dispatcher! Это сработало бы, если бы tmr был просто объектом timer, но это не так .. 🙁

2. это все еще не работает. Ошибка, которую я получаю, такова.. Система. Windows. Многопоточность. Диспетчер» не содержит определения для ‘Invoke’ и никакого метода расширения ‘Invoke’, принимающего первый аргумент типа ‘System. Windows. Нарезание резьбы. Можно было бы найти Dispatcher’ (вам не хватает директивы using или ссылки на сборку?)

3. @Gowtham Вместо этого попробуйте begininvoke

4. Я попытался установить значение Isenabled в true или false. но это тоже не работает. Не могли бы вы рассказать мне, пожалуйста, как использовать BeginInvoke?? Я действительно ценю интерес, который вы проявляете к этому ….:)

5. 1 Однако нет необходимости приводить лямбда-выражение () к Action фактически с момента запуска таймера. Запуск имеет ту же подпись, что и Action лямбда-выражение вообще не требуется. Это будет работать: Deployment.Current.Dispatcher.BeginInvoke(timer.Start);