問題タブ [cross-thread]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
195 参照

c# - CommonOpenFileDialog - UI スレッドからの呼び出し後にクロススレッド操作が無効になる

そのため、windowsAPICodepack の CommonOpenFileDialog を使用しています。私が書いているアプリケーションの以前のバージョンでは、CommonOpenFileDialog は問題なく動作しました。上位バージョンの .Net Framework を対象とする現在のバージョンでは、メイン フォームから toolstripMenuItem クリック イベントを介してメイン UI スレッドからダイアログが呼び出されても、クロススレッド操作が有効でないという例外が発生します。以前は、メイン フォームのボタン クリック ハンドラから同様の方法で呼び出されていました。

同じフォームで CommonOpenFileDialog を表示する同じコードを明示的に呼び出すと、これは解決しますが、通常のダイアログの動作はこの方法では失われます。

これは機能しますが、 this.Invoke がないと機能しません。

さらに、while(待機) はありますが、UI は応答しますが、通常、ボタンを押してブロッキング呼び出しが行われた場合はそうではありません。ここで何が起こっているのかわからない...

編集:下部にあるより広範なスタックトレース。

this.Invoke が呼び出されたときのコール スタック: this.Invoke 呼び出し時のスタック フレーム

編集 - これが ShowfolderChooser の動作です (OK の場合は true、キャンセルの場合は false を返します)。

完全な例外:

ちょっと待って...!もっとある...

そのため、そのコードを別のアプリケーションに入れてみましたが、問題なく動作します。だから私はそれが私のアプリケーションで何かだと思います。大きな違いの 1 つは、上のスタック フレームにloadWorkspaceToolStripMenuItem_Clickスタック エントリuser32.dll![Frames...があることです。それと何か関係があると思います...

EDIT2より広範なスタックトレース:

このスタック トレースから、UI のメイン スレッドで呼び出しが行われたことを確認できます。どこかでうまくいかない getHandle に問題があるようです。しかし、これは動作するはずのAPIパックに含まれています...