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();
});
}

upateMsgEvent的处理, 可以这样实现:

1
2
3
4
5
6
private void AddStatusInfo(string dbgInfo)
{
App.Current.Dispatcher.Invoke(() => {
StatusList.Add(dbgInfo);
});
}

很奇怪。