私はGUIを持っています。ボタンを押すと、GUIがソフトウェアと対話します。数秒かかります。この間、GUIの前にダイアログボックスやポップアップなどを表示して、ユーザーに(メッセージとともに)待つように指示します。GUIとソフトウェアの対話が終了すると、ポップアップが自動的に閉じ、ユーザーは再び通常どおりGUIと対話できます。
それを行う方法はありますか?
私はGUIを持っています。ボタンを押すと、GUIがソフトウェアと対話します。数秒かかります。この間、GUIの前にダイアログボックスやポップアップなどを表示して、ユーザーに(メッセージとともに)待つように指示します。GUIとソフトウェアの対話が終了すると、ポップアップが自動的に閉じ、ユーザーは再び通常どおりGUIと対話できます。
それを行う方法はありますか?
トリックは、UI スレッドを拘束しないようにスレッドをスピンオフすることです。これは通常、BackgroundWorkerを介して実現されます。
これらすべてを codeplex でセットアップするためのウォークスルーがあります。バックグラウンドワーカーが完了すると、読み込みフォームが閉じます。
これは、BackgroundWorkerコンポーネントを使用して実行する方法を簡単に示しています。
フォームにBackgroundWorkerを配置し、ボタンのクリックハンドラーで、現在のフォームの上にポップアップインジケーターフォームを表示し、RunWorkerAsyncメソッドを使用してワーカーを起動します。ワーカーのDoWorkイベントを処理し、それをハンドラーとして、長時間実行されるタスクを実行します。また、ワーカーの完了したイベントを処理し(正確にどのように呼び出されるかはわかりません)、その中でポップアップフォームを非表示にします。DoWorkイベントeventargs(Resultプロパティ)で操作結果を追跡できます。また、完了したイベントeventargのErrorperopertyを使用して、長時間実行タスク中の例外をキャッチできます。操作の進行状況は、ワーカーのReportProgressメソッドを使用してDoWorkハンドラーで報告でき、ワーカーの対応するイベントを使用してGUIでキャッチできます。
長時間実行される操作の前にマウスカーソルを待機するように設定することもできます
this.Cursor = Cursors.WaitCursor;
そして通常に戻るよりも、それで終わりです
this.Cursor = Cursors.Default;