[英]Progress indicator while page loads
我有一個WPF窗口,大約需要5秒鍾才能加載。 我想通過用戶友好的消息通知用戶,並且不確定執行此操作的最佳方法。 我能想到的兩件事:1.彈出一個對話框,顯示該消息,然后在主窗口加載后消失。 2.使用主窗口上的面板顯示消息並將UI加載到隱藏面板中。 加載完畢后,請切換可見性,以便隱藏加載進度面板並使UI面板可見。
我已經用選項1實現了應用程序,但是遇到了以下問題:1.有時,應用程序將引發Thread.Abort異常,該異常會被應用程序的未處理異常處理程序捕獲。 2.用戶可以關閉進度對話框,但主窗口仍會繼續加載。
我對進度對話框的實現非常簡單。 它只使用帶有消息的普通對話框,然后編寫了一個幫助器類來管理此消息:
public class ProgressWaitDialogHelper : IDisposable
{
private Thread _thread = null;
private ProgressWaitDialog _waitDialog;
public void ShowDialog()
{
ThreadStart threadStart = new ThreadStart(ShowDialogAsync);
_thread = new Thread(threadStart);
_thread.SetApartmentState(ApartmentState.STA);
_thread.Start();
}
public void Dispose()
{
if ((_thread != null) &&
(_thread.IsAlive))
{
_thread.Abort();
_thread = null;
}
}
private void ShowDialogAsync()
{
_waitDialog = new ProgressWaitDialog();
_waitDialog.ShowDialog();
}
}
我的調用代碼然后執行:
using (ProgressWaitDialogHelper waitDialog = new ProgressWaitDialogHelper())
{
waitDialog.ShowDialog();
// Do long running UI update loading here.
}
有誰知道我該如何解決所遇到的問題? 另外,轉到解決方案2更好嗎? 或者,還有其他更符合WPF的方法嗎?
TIA
有時,應用程序將引發Thread.Abort異常,該異常會被應用程序未處理的異常處理程序捕獲。
在主UI線程上調用Thread.Abort
。 那是例外的根源。 發生這種情況的原因可能是在UI線程中調用Dispose
(通過using
構造)與ProgressWaitDialog
自行退出其ShowDialog
方法之間的競爭,大概是在代碼的其他位置調用Close
之后。
用戶可以關閉進度對話框,但主窗口仍會繼續加載。
可以關閉進度對話框,而不會影響主窗口,因為它在單獨的線程上運行。
我建議不要在另一個線程上運行該ProgressWaitDialog
,因為ShowDialog
泵送消息,所以該線程只能在一半時間正常工作。 使用多個UI線程很棘手,並且會引起很多奇怪的問題,您已經在其中發現了一些問題。
您確實需要重新考慮對UI線程進行的長時間操作。 如果涉及從數據庫中加載數據,進行堆計算或不需要觸摸任何UI控件,則可以在輔助線程中執行該部分。 如果此較長的操作要進行大量的UI操作,則需要將其中的某些操作推遲到以后。 例如,如果您的窗口正在填充10,000條記錄的網格,則對其進行更改,以使其一次僅加載100條記錄,並實施某種分頁策略以僅在用戶單擊按鈕或其他操作后才加載下一批。
這是一種向用戶顯示您正在加載表單的干凈且有吸引力的方法。
var splashScreen =
new SplashScreen(System.Reflection.Assembly.GetExecutingAssembly(),
@"Resources\MyAppsLogo.png");
splashScreen.Show(true);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.