我正在開發 WPF (MVVM) 應用程式。我有一個正在顯示的訊息對話框。它應該只顯示一次,但顯示兩次。此對話框位于 OnCanSaveExecute() 方法中,該方法執行一些驗證以啟用按鈕。
if (!_overUnderPayment)
{
MessageDialogResult result = _messageDialogService.ShowOkCancelDialog($"Text goes here",
"Proceed?");
if (result == MessageDialogResult.OK)
{
_overUnderPayment = true;
return true;
}
else
{
_overUnderPayment = true;
return false;
}
}
_overUnderPayment 開始時為 false。如您所見,我在條件邏輯中將其設定為 true。
_messageDialogService 是...
public MessageDialogResult ShowOkCancelDialog(string text, string title)
{
MessageBoxResult result = MessageBox.Show(text, title, MessageBoxButton.OKCancel, MessageBoxImage.Hand);
return result == MessageBoxResult.OK
? MessageDialogResult.OK
: MessageDialogResult.Cancel;
}
代碼運行并且對話框正確顯示。我可以單擊“確定”或“取消”,它就會消失,然后再次顯示。
我使用斷點單步執行代碼,并且第一次運行時,它完全按照設計執行并命中 return 陳述句并結束該方法。
然后它跳回到我上面的 if 陳述句(即使 _overUnderPayment 為真)并重新顯示。
我想知道為什么它顯示兩次。
uj5u.com熱心網友回復:
我面臨的問題是競態條件。由于我使用的是 MVVM 和 async/await,這給我帶來了一個問題,因為訊息服務不是 async/awaitable。
因此,在布林值被設定為不再顯示對話框之前,代碼正在運行其他條件。此代碼位于我的 OnCanSaveExecute 方法中,該方法執行多項驗證檢查以通過委托命令啟用保存按鈕。
由于訊息服務不是異步/等待的,我通過將此對話框移出我的 OnCanSaveExecute 方法來消除我的競爭條件。我將它移到我的 OnSaveExecute 方法中。當點擊保存按鈕時觸發此方法投注。我檢查了最終用戶的退貨。如果用戶選擇“取消”,我將退出該方法以停止該方法處理保存。如果他們單擊“確定”,該方法將繼續。
我搜索并通讀了檔案,但沒有看到任何方法可以將 async/await 用于訊息,這是有道理的,因為它們本質上是同步的。如果有人成功地做到了這一點,我會對他們的方法感興趣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/402377.html
標籤:
上一篇:Blazor中的元素參考為空
