2017-12-03 287 views
0

我的應用程序基於WPF。在主窗口正忙或正在執行某些任務時打開自定義忙指示符

任務是我需要顯示一個自定義的繁忙指標,而一些工作在主窗口(因爲應用程序的用戶界面將凍結,直到它完成任務)。所以我特別想是如下

// Code in main window 
CustomBusyIndicator.ShowDialog(); 
//.... 
//..code that takes time 
//.... 
CustomBusyIndicator.Close(); 

所以我必須實現,必須能夠靈活地在我的主要應用程序的任何地方打電話,指示繁忙的窗口。

這兩點應該牢記, 1.當我告訴CustomBusyIndi​​cator,在背景中的主窗口,應運行它的任務 2.當我告訴CustomBusyIndi​​cator的CustomBusyIndi​​cator應該總是在主窗口頂部,用戶必須無法使用主窗口,如果他使用Start + Tab切換到其他應用程序,並且切換回我的應用程序時,CustomBusyIndi​​cator應該位於頂部(如果未關閉)。

當任務完成後,我應該能夠調用close()方法來關閉CustomBusyIndi​​cator,如代碼所示。

回答

0

容易解決

public async void Button1_Click(Object sender, RoutedEventArgs e) 
{ 
    // get a task for the dialog, but do not await here its completion 
    var dialogTask = CustomBusyIndicator.ShowDialogAsync(); 
    // await the completion of the lengthy operation 
    await SomeLengthOperationAsync(); 
    // close the dialog 
    CustomBusyIndicator.Close(); 
    // now await the completion of the dialog task 
    await dialogTask; 
} 

並且該擴展是

public static class WindowExtensions 
{ 
    public static async Task<bool?> ShowDialogAsync(this Window window) 
    { 
     await Task.Yield(); 
     return window.ShowDialog(); 
    } 
} 
+0

不錯的解決方案,但如果OP不知道異步等待,我不會建議他使用它。一個簡單的編程規則。不要使用你不明白的東西。我決不會對Rufo的解決方案產生負面影響,完全不是這是一個更好的解決方案,而且比我的更現代化。我只是在預測OP的經驗,這個問題說明了一切。我不認爲他對線程知之甚多。 –

0

如果你不知道如何使用異步工作伺機,只需將您的長期運行的邏輯在一個BackgroundWorker。有幾個選項可以讓背景工作者與主GUI線程通信,而不會出現任何問題。 根據你的問題和你的經驗水平,我認爲你是異常的等待你的頭。但Rufo的解決方案也很好。

谷歌是你的朋友,有很多關於使用backgroundworker和關於異步的信息也在等待。完全掌握異步等待的可能性需要更長的時間。異步等待btw不是一切的解決方案。今天遇到了一個情況,我在EF6上運行數據庫時只是說它不支持異步操作。與sql server很好地工作,但這是普遍的。完全失望,因爲現在我也不得不使用後臺工作,我的第一個想法是異步等待。

async等待的想法是,如果您正在執行長時間運行的任務,則gui線程不會被阻止。它更像是一個等待點,如果長時間的操作完成,它將繼續下去。

其他選項是使用RX,但難度級別再次提高。

使用背景工作,你很好,你的gui永遠不會被阻止。你甚至可以取消背景工作者的工作。優秀的解決方案。

+0

當您可以使用背景工作者時,您可以使其成爲異步/等待,並且可以從調用站點獲得更多幹淨的用途。 –

+0

是rufo,但我的觀點是OP很可能不太瞭解異步等待。正如我所說,你不應該使用你不明白的東西。我只是想降低難度級別。但是,如果OP認爲他需要異步等待,他應該盡其所能。這也是我的第一選擇。 –

相關問題