#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);