我試圖建立一個簡單的對話框,在一個任務運行時顯示一個加載影片。
我使用Prism的IDialogService和IEventAggregator。
然而,我得到了一個System.InvalidOperationException,因為帶有影片的對話框彈出,但在任務完成后卻沒有被關閉。
例外訊息是。呼叫執行緒不能訪問這個物件,因為另一個執行緒擁有它。
可以通過點擊它的 X 按鈕來關閉該對話框,沒有任何問題。
在非異步情況下,我可以按照我的意愿打開和關閉對話框,但我無法以異步方式完成這一作業。
這就是我目前想出的辦法,它導致了上述的錯誤。
WarehouseViewModel.cs
資料已被加載,并顯示了對話框。
private async void LoadData()
{
await WarehouseListLoad().ContinueWith(t => { _eventAggregator.GetEvent<LoadingFinishedEvent> ().Publish(true); });
}
private async Task WarehouseListLoad()
{
_dialogService.ShowDialog("LoadingDialogView"/span>)。
List<Warehouse> warehouses = await Task.Run(() =>
{
List<Warehouse> list = _warehouseStore.GetAll();
return list;
});
}
LoadingDialogViewModel.cs
監聽LoadingFinishedEvent并呼叫RequestClose。
。
public event Action<IDialogResult> RequestClose;
public LoadingDialogViewModel(IEventAggregator eventAggregator)。
{
eventAggregator.GetEvent<LoadingFinishedEvent>().Subscribe(close => CloseDialog(null))。
}
protected virtual void CloseDialog(string parameter)
{
RaiseRequestClose(new DialogResult(ButtonResult.None))。
}
public virtual void RaiseRequestClose(IDialogResult dialogResult)
{
try
{
RequestClose?.Invoke(dialogResult)。
}
catch(System.InvalidOperationException ex)
{
Debug.WriteLine(ex.Message)。
//System.InvalidOperationException: 呼叫執行緒不能訪問這個物件,因為另一個執行緒擁有它。
}
uj5u.com熱心網友回復:
你要么想在UI-Thread上Subscribe
eventAggregator.GetEvent<LoadingFinishedEvent>().Subscribe(close => CloseDialog(null), ThreadOption.UIThread) 。
或者使用Dispatcher來呼叫RequestClose。
Application.Current.Dispatcher.Invoke( () => RequestClose?.Invoke(dialogresult) )。
或者你放棄Task.Run并使GetAll實際上是異步的...
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/324486.html
標籤:
上一篇:我怎樣才能提取一個int?
