MVVM下线程数据的更新
问题背景
按照Prism中的说法, Prism的Command本身是异步的. 但是我在使用中, 发现Command的实现总是会阻塞UI线程的, 也就是说默认情况下它总是在UI线程中运行的.
ViewModel中更新数据
比如, 下面有两个耗时函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public StatusCode RunTest1() { Trace.WriteLine("RunTest1 Begin"); updateMsg?.Invoke("RunTest1"); Task.Delay(3000).Wait(); Trace.WriteLine("RunTest1 Finished"); return StatusCode.DCM_TENSCANMOVING_START; }
public StatusCode RunTest2() { Trace.WriteLine("RunTest2 Begin"); updateMsg?.Invoke("RunTest2"); Task.Delay(3000).Wait(); Trace.WriteLine("RunTest2 Finished"); return StatusCode.DCM_TENSCANMOVING_START; }
|
而我们的Command函数:
1 2 3 4 5 6 7 8 9 10 11
| public DelegateCommand LowScanCmd => _lowScanCmd ?? (_lowScanCmd = new DelegateCommand(doLowScan, canDoLowScan));
async void doLowScan() { var x = await Task<StatusCode>.Run(() => { Trace.WriteLine("doLowScan"); _hardwareApi.RunTest1(); return _hardwareApi.RunTest2(); }); }
|
而upateMsg
Event的处理, 可以这样实现:
1 2 3 4 5 6
| private void AddStatusInfo(string dbgInfo) { App.Current.Dispatcher.Invoke(() => { StatusList.Add(dbgInfo); }); }
|
很奇怪。