- ベストアンサー
IsBusyプロパティ
BackgroundWorker.IsBusy の意味がいまいちわかりません。 このページの http://msdn.microsoft.com/ja-jp/library/system.componentmodel.backgroundworker.isbusy(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2 非同期操作を実行中の意味を教えてください。 この命令を使って、ウェブブラウザーがページを完全に表示するまで待たせるという命令を作りたいと考えています。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
Silverlight + C#での開発を行なうときに使いました。 開発環境が、それとあっているか分かりませんが、以下は想像で続けます。 また、手元に開発環境が無いので、スペルなど、うろ覚えですのでご了承ください。 ご質問の意図を察すると、BackgraoudWorkerではなく、 普通にコントロールのイベント処理をハンドルするほうが良いでしょう。 もし独自に判定プログラムを作り、これを並行動作させると言うならば、判定処理は独自で工夫を。 1.コントロールのイベント処理で判定する方法 Silverlightを使う場合は、Loaded イベントや SizeChennged とかでひっかかります。 各コントロール個別に設定できますので、どれに掛けるかを工夫し、タイミングなどを自分で試す。 泥臭いですが、結構いけます。 イベント処理の中では、各コントロールにはActualWidth やActualHight と言うプロパティがあり、 これが表示サイズになっていれば、そのコントロールは表示が終わっているとか、 自分が使用しているコントロールの特徴を見ながらコツを掴んでいくのが良いかと思います。 とりあえず、 Layoutrootも含め、Loded、SizeChangedを全て設定し、それぞれのイベント処理コールバックで、 Stringメッセージを作り、表示させるなどをすると、何時どのタイミングで呼ばれるかわかります。 ウェブページが全て表示されたときに該当したハンドル処理内で、 プログラム開始をすると良いでしょう。 2.BackgraoudWorkerの一般的な使い方 では、BackgroundWorkerはといいますと、 処理の重いプログラムを内部で走らせるとき、 ウェブページの動作が止まってしまうため、並行動作をさせるときに使います。 これを非同期処理と読んでいます。 例えば、ウェブページでファイルをロードしたり、データを集計したり、検索したりなど、 処理に時間が掛かるプログラムを作ったときに活躍します。 こういう場合は、GUI処理が重くなったり、止まったりします。 そこで対象となる重い処理だけを分離し、BackgroundWokerの下で動かします。 BackgroundWorkerでは、処理中途、終了に関してコールバックが定義できます。 処理途中は、処理の進行状況を表示するときのためのコールバック処理です。 私は無視して空にしています。 終了に関しては、結構重要です。ここで一括して色々できます。 処理終了待ちの待機として、ご提示MSのサンプルの様に、 isBusy のプロパティをチェックする事も可能ですが、これはしません。あくまでもサンプル。 通常は、GUI処理にブロックを掛けないと、再突入などの誤動作をしますから、 ・全GUIをブロックする ⇒BusyIndicator 参照 ・ボタンやコントロール単位でブロックする ⇒isEnabled = false などで対応し、さきほど述べたコールバック処理でこれらを解放するのがスマートです。 3.まとめ ・Silverlightの表示終了タイミングを得るためにはイベント処理を使う。 ・内部処理が終わるまでGUI動作を制御する場合に、BackgroundWorkerを使う。 で考えてください。 以上、ご参考までに。
お礼
なるほど、思ったより単純にはいかなそうです。 ありがとうございました。