0

メインアプリが db に接続して初期データを取得している間に、読み込みフォームを表示したいと考えています。これには 5 ~ 10 秒かかることがあるため、何かが起こっていることをユーザーに知らせたいと思います。

これは私が思いついたものです:

frmStart _frmStart = new frmStart();
Thread t = new Thread(() => _frmStart.ShowDialog());
t.Start();
objDAL = new DBManager();
objDAL.conSTR = Properties.Settings.Default.conDEFAULT;
PrepareForm();
t.Abort();

これが最善の方法ですか?

4

2 に答える 2

2

いいえ、これはフリーズしたUIの問題を解決するものではなく、単にそれを紙に書き留めるだけです。不完全なことに、ダイアログの親はデスクトップであり、フリーズしたウィンドウの下に簡単に表示される可能性があるため、まったく表示されません。また、ダイアログは別のスレッドで実行されるため、通常のウィンドウにモーダルではありません。ユーザーが応答しないウィンドウをクリックし始めたときの失敗モードは非常に醜いです。UIスレッドが生き返ったときに、これらのクリックはすべてディスパッチされます。

これには回避策があります(SetParentをピンボークして、メインウィンドウを自分で無効にする必要があります)が、それは間違った問題を解決するだけです。UIスレッドを1秒以上ブロックさせないでください。BackgroundWorkerを使用して手間のかかる作業を行い、RunWorkerCompletedイベントハンドラーのクエリ結果でフォームを更新します。

于 2012-07-07T10:49:15.997 に答える
1

WinForms を使用している場合は、このA Pretty Good Splash Screen in C# を参照してください。WPF を使用している場合は、このImplement Splash Screen with WPF をご覧ください。

于 2012-07-07T10:10:01.840 に答える