2016-07-07 67 views
0

首先代碼,運行沒有錯誤,但不涵蓋一切,我需要它:暫停代碼的執行,而不是應用程序

public async Task SaveData() 
{ 
    // MessageDialog restartMessage; 
    // ^^ This was made global and is defined in SafeToSave() 

    // Check if it's safe to save 
    await SafeToSave(); 
    if (restartMessage != null) 
    { 
     CoreDispatcher cD = Window.Current.CoreWindow.Dispatcher; 
     await cD.RunAsync(CoreDispatcherPriority.Normal, async() => 
     { 
      await restartMessage.ShowAsync(); 
      // This WILL invoke 'Application.Current.Exit()' 
     }); 

     return; 
     // Issue is right around here... 
    } 

    // Other code... 

} 

的基本前提是,如果它是不安全的保存,消息對話框會告訴用戶應用程序需要重新啓動,然後在點擊'好'按鈕時執行'Application.Current.Exit()'。

我的問題是,我需要我的代碼停止執行時,重新啓動命中。現在「返回」只會結束這個方法,但在此之後,它將繼續在調用SaveData()的方法中執行其他操作,直到我的restartMessage生效,這並不好。

我認爲把'Application.Current.Exit()'放在'return'語句的上面,但是在我的錯誤消息可以被看到之前這會關閉。這也不好。

另一種解決方案是跳過整個CoreDispatcher的事情,只是自己運行ShowAsync(),除了會觸發不同的已知錯誤。基本上我有一些調用SaveData()方法的MessageDialogs,當另一個MessageDialog已經打開時打開一個MessageDialog也是不好的。

就是這樣:我需要一些東西來阻止我的代碼表單執行,而不會殺死整個應用程序或阻止顯示我的錯誤消息。我能做什麼?

+0

您必須等到用戶單擊確定按鈕。使用MessageDialog.Commands。 –

+0

這就是我現在正在做的。我的問題是,代碼繼續執行,直到發生這種情況,我不希望它。我能阻止嗎? –

回答

0

短版,我用這個傢伙的解決方案:MessageDialog ShowAsync throws accessdenied exception on second dialog

由於當調度員將要發生我無法控制,有必要給廢了。現在我說我不能這樣做,因爲它阻止了另一個bug,所以我使用該鏈接中的建議以不同的方式防止該錯誤......所以現在我可以拋棄Dispatcher並強制我的應用程序處理我的消息對話框沒有繼續沿着它的多線程路徑並做它不應該的事情!

我的解決方案的代碼被移入SafeToSave()方法。我把那個鏈接的傢伙做了什麼,然後改變了這一點:

CoreDispatcher cD = Window.Current.CoreWindow.Dispatcher; 
await cD.RunAsync(CoreDispatcherPriority.Normal, async() => 
{ 
    await restartMessage.ShowAsync(); 
}); 

進入這個:

await restartMessage.ShowAsync(); 

而且不像我沒有得到一個訪問錯誤調用ShowAsync(),而另一個MessageDialog前已經上漲了,因爲我先強行關閉它。