2

現在の にラムダ式を投稿するWindowsFormsSynchronizationContextと、ラムダ コードがバックグラウンド スレッドで実行されることがわかりました。

// running on main thread here

myLabel = new Label();
this.Controls.Add(myLabel);

WindowsFormsSynchronizationContext.Current.Post( ignore => {

    // returns true !
    bool invokeRequired = myLabel.InvokeRequired; 

    // returns a background thread, not the UI thread
    int threadId = System.Threading.Thread.CurrentThread.ManagedThreadId; 

    // throws, because we are (unexpectedly) on a background, different thread
    myLabel.Text = "whatever";

},null);

その上、を返すのではなく、通常WindowsFormsSynchronizationContext.Currentの を返すようです。WindowsFormsSynchronizationContextSystem.Threading.SynchronizationContext

これは、スレッドの問題がなく、最近変更されていないフォームで突然発生しています (ソリューションの他の部分は変更されていました)。明らかな間違い (バックグラウンド スレッドでフォーム自体をインスタンス化するコードや、バックグラウンド スレッドで作成されたコントロールなど) を探してみましたが、重大な違反を見つけることができませんでした。

おそらく私は間違った方向を見ていますか?

4

1 に答える 1

5

WindowsFormsSynchronizationContext.Currentと同じSynchronizationContext.Currentです。派生クラスを介して基本静的メンバーを呼び出しているというコンパイラ警告が表示されるはずです。

確認SynchronizationContext.Current.GetType()すると、別の同期コンテキストで実行されていることがわかります。

UI スレッドで正しいコンテキストをキャプチャして保存します。

于 2013-07-16T13:46:55.817 に答える