使用ObservesProperty进行多线程处理

时间:2016-07-21 10:37:24

标签: c# prism

我有这样的命令:

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看起来会导致问题。它是错误还是按设计工作?

1 个答案:

答案 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 - 只是浪费一个线程等待用户界面完成。