我想使这两种方法(1.domaminModel.Load(),2 UpdateState())上运行一个接一个的相同的线程。不在 的UI线程上。
更新,如果你想只_domainModel.Load
和ImageSelectionViewModel.UpdateState
到一个单独的非UI线程中运行,那么就这样做:
public async override void InitData()
{
_domainModel = new DomainModel()
ProgressIndicatorViewModel.Start();
_State = Getstate();
await Task.Run(async() =>
{
await _domainModel.Load(_State, ProgressIndicatorViewModel))
ImageSelectionViewModel.UpdateState(_State); //returns void not a task!
});
ProgressIndicatorViewModel.Stop();
ImageSelectionViewModel.RefreshImages(_imageList);
}
注意您不需要DispatcherHelper.UIDispatcher.Invoke()
包装即可。
如果你想的
InitData
_domainModel.Load
后剩下的一个单独的线程运行:您在这里
public async override void InitData()
{
_domainModel = new DomainModel()
ProgressIndicatorViewModel.Start();
_State = Getstate();
await Task.Run(() => _domainModel.Load(_State,
ProgressIndicatorViewModel)).ConfigureAwait(false);
ImageSelectionViewModel.UpdateState(_State); //returns void not a task!
DispatcherHelper.UIDispatcher.Invoke(() =>
{
ProgressIndicatorViewModel.Stop();
ImageSelectionViewModel.RefreshImages(_imageList)
});
}
注意Task.Run
会自动解开嵌套任务(的Task<Task<T>>
)。另外,您可能需要将ProgressIndicatorViewModel.Stop()
移至Dispatcher.Invoke
之内。
根据内部_domainModel.Load
什么,你可能甚至不需要Task.Run
:
await _domainModel.Load(_State,
ProgressIndicatorViewModel).ConfigureAwait(false);
一个侧面说明,你应该处理您的async void InitData
方法内部异常。你将无法在它之外处理它们。
不是问题的关键,但'DispatcherHelper.UIDispatcher.Invoke'没有必要,因为您已经在UI线程上了。我很惊讶,即使运行。 – usr
需要刷新可观察集合。别担心。运行完全 – Gilad
'UpdateState'也是'async void',与'InitData'相同?有什么理由不使用'async Task'吗? – Noseratio