var response = {success: "success", msg: "2017_nissan_gtr-2560x14409.jpg"}
var success = response.success;
var msg = response.msg;
在其他方法中我打电话
CancelCommand = new DelegateCommand(Cancel, () => IsProcessing).ObservesProperty(() => IsProcessing);
当Task.Factory.StartNew(() =>
{
IsProcessing = true; // Stop here
IsProcessing = false;
});
设置为IsProcessing
时,执行会停止。但是当我改为
true
在非线程中设置Application.Current.Dispatcher.Invoke(() => IsProcessing = true);
IsProcessing = false; // Hit this line then stop again
int i = 0; // Never reach here
时,ObservesProperty
看起来会导致问题。它是错误还是按设计工作?
答案 0 :(得分:1)
这个问题并非Prism独有。所有Prism都会连接到您指定的属性的INotifyPropertyChanged
并调用CanExecuteChanged
事件。
事件ICommand.CanExecuteChanged
可能会导致更改UI元素(例如更改按钮的值IsEnabled
属性) - 因此必须从UI线程调用它。与绑定引擎不同,它不会自动执行此操作。
你应该:
在启动线程之前/之后,从UI线程设置属性。使用async / await可以很容易:
async Task DoStuff() // start this method from the UI thread
{
IsProcessing = true;
try
{
await Task.Run(() => { ... });
}
finally
{
IsProcessing = false;
}
}
使用Dispatcher.InvokeAsync
。 不使用Invoke
- 只是浪费一个线程等待用户界面完成。