我想使這兩種方法(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