我想運行的東西像後臺線程,並通過提高事件通知此背景線程的狀態的ViewModel。 ViewModel反過來引發OnPropertyChanged事件。不幸的是,相應的視圖不會更新。查看不更新時,從另一個線程事件更改屬性
後臺線程的一部分,我通知視圖模型可以在這裏看到:
private void RunThread() {
while(true) {
suspendEvent.WaitOne(Timeout.Infinite);
if (shutDownEvent.WaitOne(0)) {
break;
}
if (pauseEvent.WaitOne(0)) {
pauseEvent.Reset();
}
Notify("Cleaning started!");
pauseEvent.WaitOne(TimeSpan.FromSeconds(5));
Clean();
Notify("Cleaning finished!");
pauseEvent.WaitOne(TimeSpan.FromSeconds(5));
}
}
private void Notify(String status) {
NotifyOfCleanerStatusHandler handler = NotifyOfcleanerStatus;
if (handler != null) {
handler(status);
}
}
視圖模型的,我收到事件的部分可以在這裏看到:
public void SetCleanerStatus(String status) {
CleanerStatus = status;
}
而且最後,我看到的屬性我看到這裏:
public String CleanerStatus {
get {
return cleanerStatus;
}
set {
if (value != null) {
cleanerStatus = value;
OnPropertyChanged("CleanerStatus");
}
}
}
有趣的薄g是:視圖將顯示以上狀態之一,即「開始清理!」或「清潔完成!」。人們會認爲它們應該以5秒爲間隔交替。不是這種情況。
如果我刪除第一個waithandle調用(pauseEvent.WaitOne(TimeSpan.FromSeconds(5));)視圖中的消息是「清理完成」並保持這種狀態。如果我保持行,消息是「清潔開始!」並保持這種方式。調試顯示已到達行OnPropertyChanged(..)。
我在做什麼錯?
很奇怪,你在做什麼,爲什麼你想從另一個線程更新屬性ViewModel應該在主線程中工作?! –
處理程序是否在任何時候都爲空? –
我認爲你的lus會立刻崩潰因爲shutdownevent.waitone(0)沒有等待而返回。檢查msdn:「如果millisecondsTimeout爲零,則該方法不會阻塞,它會測試等待句柄的狀態並立即返回。」 - http://msdn.microsoft.com/en-us/library/vstudio/cc189907(v=vs.110).aspx @備註部分 –