2011-07-13 7 views
2

クロススレッドUIの更新の安全性が自動的に処理されないのはなぜですか?コンパイラ(またはランタイム)が私のためにInvokeRequiredパターンを実行しないのはなぜですか?

UIを別のスレッドから更新する可能性がある場合にスレッドの安全性を保証するには、if (Control.InvokeRequired()) Invoke(..)パターンまたは同等のものを記述する必要があります。ランタイムは、別のスレッドからUI更新メソッドを呼び出すときに私の呼び出しをマーシャリングするときに観察できますか?必要な予防措置を取らずにそれを実行しようとすると、例外がスローされるため、いつ必要なのかを知る必要があります。

コンパイラはすべてのUI更新呼び出しでパターンを適用できますか?これが許容できないオーバーヘッドを引き起こす可能性がある場合、おそらくこの機能はアプリケーション属性によって制御される可能性があります(開発者は、クロススレッドUIアップデートが行われるマルチスレッドアプリケーションを作成する場合にのみ属性を適用できます)。

私はいくつかの潜在的な答えを想像することができます。なぜなら、それは愚かなアイデアか、不可能/非実用的なのか、または開発コストを正当化するのに十分な価値を追加していないからです。

+1

これは広く乱用されたパターンです。 UIスレッドとワーカースレッドの両方で実行できるコードを書くことは非常にまれです。診断にはInvokeRequiredを使用する必要があります。コードがワーカーで実行されていることを知っているときにfalseを返すと、重大な誤りがあります。 –

+0

@ハンス:起こることができますか? –

+0

はい、ウィンドウを作成する前にスレッドを開始するのが早すぎます。または、より一般的には、ウィンドウを閉じる前にスレッドが停止していることを確認することを忘れてしまいます。あなたが長い実行中のプロセスを持っている、とあなたはそれが終了したことを示すためにUIを更新したい場合は、ワーカースレッドをオフに産卵していない場合、私はここにハンスに反対 –

答えて

1

私は答えることができない理由は、この機能を使用するなどの方法を追加することができ、テストのコスト、メンテナンスに関するマニュアルなど....価値がある場合、私は求めることができるが、:あなたは、その後でき

public static void UpdateControl(this Control ctrl, Action<Control> action) 
    { 
     if (ctrl.InvokeRequired) 
     { 
      ctrl.Invoke(action,ctrl); 


     } 
     else 
     { 
      action(ctrl); 

     } 

    } 

このように使用してくださいthis.textBox.UpdateControl(c=>c.Text="Thread Safe");

+0

合意。当然考えられる多くの言語機能はありますが、実装する価値はありません。もしそれがここに当てはまるなら、私はそれを確認したいと思います(うまくいけばエリック・リッペルトか他のMSの建築家がチャイムに入ります)。 –

関連する問題