2012-06-14 6 views
5

私はVS2010とC#を使ってデスクトップアプリケーションをビルドします。このアプリケーションには、完了に多くの時間を要する巨大なタスクを伴う1つのフォームがあります。このフォームが初期化されるときに画像が表示さのように、それは、タイトルバーにを「応答なし」と表示以外は、完璧に動作します:ウィンドウのタイトルバーに応答していないメッセージが表示されないようにするにはどうすればよいですか?

enter image description here

は、すべてのタスクを完了した後、それが所望の出力を示しています。このメッセージが表示される理由とその防止方法を教えてください。

+0

これは多くの経験を持っていない人にとって正当な質問であるため、私はこれを否定しました。 – siride

答えて

4

時間のかかるタスクが別のスレッドで非同期に実行されるように、BackgroundWorkerを使用する必要があります。これにより、WindowsのマルチタスクによりUIが応答可能になります。アプリケーションがビジー状態であることをユーザーに知らせるには、待機カーソルなどのビジュアルインジケーターを使用する必要があります。 MSDN MSDN BackgroundWorker

のBackgroundWorkerクラスから

あなたは独立した専用のスレッドで操作を実行することができます。ダウンロードやデータベーストランザクションなどの時間がかかる操作は、ユーザーインターフェイス(UI)が実行中に応答を停止したように見えることがあります。応答性の高いUIが必要で、そのような操作に関連する長い遅延に直面している場合、BackgroundWorkerクラスは便利なソリューションを提供します。

バックグラウンドで時間のかかる操作を実行するには、BackgroundWorkerを作成し、操作の進行状況を報告するイベントと、操作が完了したときに信号を待ちます。 BackgroundWorkerはプログラムによって作成することもできますし、ToolboxのComponentsタブからフォームにドラッグすることもできます。 WindowsフォームデザイナでBackgroundWorkerを作成すると、コンポーネントトレイに表示され、そのプロパティが[プロパティ]ウィンドウに表示されます。

バックグラウンド操作をセットアップするには、DoWorkイベントのイベントハンドラを追加します。このイベントハンドラで時間のかかる操作を呼び出します。操作を開始するには、RunWorkerAsyncを呼び出します。進行状況の更新の通知を受け取るには、ProgressChangedイベントを処理します。操作が完了したときに通知を受け取るには、RunWorkerCompletedイベントを処理します。

1

UI(メイン)スレッドをロックしないように、バックグラウンドスレッドで巨大なタスクを実行する必要があります。

+0

BlackSpyが返信してくれてありがとう、この行は「UI(メイン)スレッドをロックする」とは分かりませんが、いくつか詳細を教えてください。 – shamim

+1

Backgroundworkerクラスについていくつかの調査を行い、そこでプロセスを実行することをお勧めします。これにより、長時間実行される操作が完了するのを待っている間に、UIがフリーズするのを防ぐことができます。これは、「仕事」がUIとは異なるスレッドで実行されているために、UIイベント(ペイント、リフレッシュなど)がブロックされないためです。 – tsells

関連する問題