WebBrowser.Document
1 つのドキュメント処理スレッドが完了すると、オブジェクトが壊れていて使用できないことに気付くのに、週末中ずっとかかりました。
次のようなコード:
if (Browser.Document == null) ...
例外を発生させます。
ドキュメントをWebBrowserにロードしてアクションを実行するイベントベースのスクリプトがいくつかあります。すべてのスクリプトが完了すると、イベントが発生します。
次に、ドキュメントの状態に応じて、他のスクリプトを実行します。しかし、文書はありません!なんで?それはどうなりますか?ランダムなデータによって破壊、廃棄、上書きされていますか?
最後のイベント .Invoke とドキュメントのテストの間にコードはありません。1 行前にドキュメントがありますが、次の行にはありません。何が起こるのですか?!
System.Threading.Thread.CurrentThread.ManagedThreadId
これらの 2 行の他の値を返します。このキラーの回避策はありますか? 今のところ、それを処理する方法は1つしか見つかりませんでした-ドキュメントをリロードできます:
Browser.Url = Browser.Url.
しかし、これは愚かで冗長です。
全体のポイントは、WebBrowser を使用してドキュメントに対してより多くの操作を実行できるようにすることでした。
もう 1 つ、最初のアクション チェーンを起動するスレッドが新しいタスクとして実行されます。ドキュメントを操作する残りのコードとは異なるスレッドで実行されます。私はそれが間違っていることを知っていますが、初めて正しいことをしました。新しいタスクを開始する代わりに、BeginInvoke を使用してスクリプトを非同期で実行しました。しかし、これはコード内の最初の他の呼び出しでアプリ全体をハングさせます。私はここで立ち往生しています。ブラウザー コードを間違った方法で呼び出すと、すべてのマルチスレッド アプリケーションが動作しますが、どこかでドキュメントが失われます。適切なスレッドセーフな方法と呼ぶと、アプリがハングするだけで、デバッグすることさえできません。呼び出すべきメソッドを呼び出さないコードは、呼び出し時に停止します。もちろん黙って。