2

UI を正常に更新するコールバックを使用して、フォーム アプリケーションにいくつかの System.Threading.Timers があります。つまり、エラーをスローすることはありません。

UIスレッド以外のスレッドでUIを更新してはならないことを知る前に、これらを以前に構築しました。

これらの個別の threading.timer スレッドで UI を更新しているときに、クロススレッド例外がスローされない理由について混乱していますか?

UI の更新が UI スレッドで呼び出されるように、これらのコールバックを変更しますが、なぜこれが機能するのか興味があります。

編集:私のアプリケーションは WinForms アプリケーションです。

4

4 に答える 4

2

UI の更新が UI スレッドで呼び出されるように、これらのコールバックを変更しますが、なぜこれが機能するのか興味があります。

これが Windows フォームの場合、運だけで機能します。バックグラウンド スレッドでの UI の更新は一貫して機能するとは限りませんが、スローしない場合があります。特に、CheckForIllegalCrossThreadCallsが false の場合、動作が間違っていることがよくありますが、"動作" し、決してスローしないことがあります。一部のコントロールは常にすべてのプロパティをチェックするとは限らないため、一部の項目は常に正しく機能していなくても「機能」します。これは通常、後で診断して修正するのが困難なバグを引き起こす可能性があるためです。

補足: これが WPF の場合、UI にバインドされた項目の値を変更して、バックグラウンド スレッドで UI を効果的に更新できます。WPF バインディング システムは、これを UI スレッドに自動的にマーシャリングします。ただし、コレクションの一部を変更することはできません。

于 2012-06-04T16:35:46.547 に答える
1

私もWinFormsでこれを経験しました。ここを参照してください:別のスレッドから UI 要素にアクセスできますか? (設定しないでください)私の意見では、それは「魔法」(「ランダムな方法で」読む)によって機能し、実際にそれを行うための招待と見なされるべきではありません. これは、GUI を更新するためのスレッドセーフな方法ではありません。プログラムが文句を言わないこともあります。

于 2012-06-04T16:36:59.307 に答える
1

.NET 1.0 および 1.1 では、クロススレッド チェックが実行されないため、エラーが発生することはありませんInvalidOperationException(ただし、MSDN は、クロススレッド更新を実行すると「多くの場合、予測できない結果が生じる」ことを認めていますが、これにはアプリケーションのクラッシュが含まれる可能性があります)。

Control.CheckForIllegalCrossThreadCalls.NET 2.0 以降では、静的プロパティの値に応じてクロススレッド チェックが実行されます。そのデフォルト値は、Debugger.IsAttached静的プロパティ (デバッガーがプロセスにアタッチされているかどうかを示す) から初期化されます。つまり、アプリケーションが単独で (Visual Studio またはそれにアタッチされている他のデバッガーなしで) 実行されている場合、クロススレッド チェックは実行されません。 )。

もちろん、この設定は、参照されるライブラリを含むユーザー コードによってオーバーライドされる場合があります。

于 2012-06-04T18:05:30.093 に答える
0

これは、作成しているタイマーのタイプに関係していると思います。次の 2 つのタイプがあります。

    System.Timers.Timer;
    System.Windows.Forms.Timer 

これら 2 つには明確な違いがあります。UI を更新すると、System.Timers.Timer は例外をスローしますが、System.Windows.Forms.Timer はスローしません。using ステートメント :"Using System.Windows.Forms" があり、単純に "Timer" がある場合、これは System.Timers.Timer とは明らかに異なる Windows.Forms.Timer になります。

内部では (私は信じています) System.Windows.Forms.Timer が WM_TIMER メッセージをトラップしているため、GUI を更新しているスレッドにいます。

于 2014-03-06T16:48:49.920 に答える