2011-07-19 119 views
5

私はテキストを書式設定できるように、WebBrowserコントロールに基づいてメッセージングシステムを開発しています。ユーザーがオフラインでメッセージを送信すると、メッセージが保存され、再度ログインするとすべてのメッセージに対してイベントが送信されます。通常、次のように使用します。Application.DoEvents()の代わりに

while (this.webBrowser1.ReadyState != WebBrowserReadyState.Complete) Application.DoEvents(); 

これは、プログラムが正常に動作しているときに機能します。ユーザーがオフラインで送信されたメッセージを受信すると、次のメッセージイベントなどがトリガーされ、最後までメッセージが表示されます。これは、オフライン時に最後に送信されたメッセージだけが表示されることを意味します。 Application.DoEvents()のように、コントロールの更新とロードを継続できるようにしたいが、それは他のイベントをトリガーしない。

おかげ

EDIT:

私は完全に)(DoEvents関数を削除することで問題を修正しました。私が働いていたときにDocumentTextを変更する代わりに、文字列ビルダを設定し、最後にhtmlを一度に設定しました。

+2

あなたが 'Application.DoEvents()'を呼び出すのであれば、通常あなたのデザインに欠陥があることを示します。 「完了」イベントを使用できない理由はありますか? – leppie

+0

私は本質的には、読み込みを終了するにはWebブラウザが必要ですが、現在のスレッドは実行を継続します。私はメッセージを書式設定し、バッキングHTMLをチェックします。 htmlが間違っている場合、私はそれを更新し、メッセージを追加します。私は文書のテキストを変更する前に、Webブラウザが読み込まれていて、読み込みが完了していることを確認します。 –

答えて

5

Application.DoEvents()の使用を中止することをお勧めします。それは解決する以上の問題を引き起こします。 thisを確認してください。

より良い方法は、読み込みが完了するたびに通知するか、読み込みが完了するたびにイベントを呼び出すことです。他のスレッドであなたの待機を実行することもできます。Application.DoEvents() ...

+0

それは素晴らしい記事でした。本当に、私はちょうど、WebBrowserコントロールの読み込みを終了し、次に続行することを許可したいと思います。コードが発行を避けるのに十分な速さで実行される必要があるため、ユーザーインターフェイスが影響を受けるかどうかは気にしません。 DoEvents()の動作方法は、私はそれが解決策にも近くないことを知っています。私は他のイベントに行くことを避けたいです。私ができるなら、走っている方法の中にとどまりたい。 –

+0

これは私の問題を解決しませんでしたが、私はDoEvents()に関するリンクのために答えを受け入れています。提供された情報は、私がプログラムを書き直すのに十分なものでした。 –

0

DoEvents()の代わりにSystem.Threading.Thread.Join()を使用できます。このメソッドは、前の呼び出しスレッドが実行を完了するまで現在のスレッドの実行を停止するためです。

+1

これは、Webブラウザーの読み込みを許可しません。また、2番目のスレッドはありません。 – SLaks