Windows.Forms ソリューションでいくつかのスレッドを作成しています。
また、BrowserControl (うん、それは OAUTH です) も持っています。もちろん、デバッグに関する問題を見つけています -
クロススレッド操作が無効です: コントロール 'xxForm' は、それが作成されたスレッド以外のスレッドからアクセスされました
それでも私は「正しく」呼んでいます
xxForm.Show()
それが呼び出し呼び出しにラップされていることを確認することによって
.Invoke(新しい MethodInvoker())
それでもスレッドの問題が発生します。私は他のすべて(Focus、BringToFront)を行うことができますが、それはショーのエラーです。
さらに、GUI はブラウザーの応答を取得して表示することはありません。VS デバッガーでは、上記のスレッド エラー (バックグラウンド スレッドのアパートメント状態 == MTA) が発生します。EXE として実行すると、同じコードに STA のスレッド アパメントがあり、デバッグ時に GUI が表示されませんが、EXE を直接実行すると、スレッドの問題はなく、ブラウザ コントロールが入力に応答しません。
質問は次のとおりです。
- VS / EXE で動作が異なるのはなぜですか?
- VS でデバッグするにはどうすればよいですか?
- BrowserControl は複数のスレッドで問題なく動作しますか?
アップデート
はい、コードがないことはわかっています。コードが長すぎます。何ができるか見てみます。
また、回答を投稿する前に質問をお読みください。UI スレッドでバックグラウンド スレッドを呼び出しています。それは問題ではありません。これは結果に影響しません。それを推奨する回答に反対票を投じます。
また、いくつかの希望-私は何時間も検索しました。メッセージポンプにリンクされています。メッセージ ポンプが実行されていない限り、DocumentCompleted イベントは受信されません。
更新 2 私が管理するベストは疑似コードです:
プログラム:
startWorkQueue
LoadForm (don't show)
スレッド 1:
addToQueue
スレッド 2:
readFromQueue
ShowForm (on occasion)
現在、ShowForm メソッドは Windows.Form コントロールにあります。この中で呼び出しは Invoke を介して行われるため、2 番目のスレッドが ShowForm を呼び出すにもかかわらず、実際の .Show() などの呼び出しは UI スレッド上にあります。
それで、私は何が欠けていますか?クロススレッド例外がある理由がわかりません....