2011-08-04 16 views
2

ゲッタースレッドを安全にしたいと思います。私はこれを行うと、私はエラーを取得する:C#InvokeRequired with property getter

Cannot cast expression of type 'Foo.Model.ApplicationViewModel' to type 'Action<ApplicationViewModel>' 

答えて

6

たくさん書くことができます:あなたはBeginInvokeメソッド、Invokeはあなたがアクション<を使用することはできません

  • を必要とする使用することはできません

    • >を、あなたは値を返すされていますso Func<>が必要です
    • 呼び出し後に元のコードを実行することもできません。elseが必要です。生成

    public ApplicationViewModel SelectedApplication 
    { 
        get 
        { 
         if (this.InvokeRequired) 
          return (ApplicationViewModel)this.Invoke(new Func<ApplicationViewModel>(() => this.SelectedApplication)); 
         else 
          return _applicationsCombobox.SelectedItem as ApplicationViewModel; 
        } 
    } 
    

    を低レベルのプロパティ内のスレッドのコンテキストスイッチを非表示には、通常は間違いです。呼び出しには多くのオーバーヘッドがあり、結果のコードは非常に遅くなってしまい、なぜそれが遅いのかというヒントはありません。

  • +0

    コンシューマには透過的ですが、このプロパティを同期的に取得するために、他のメソッドがどのように呼び出されたかを気にする必要はありません。呼び出し元がUIスレッド上にあることを100%確信した場合にのみ、速度の低下を減らすことができます。 – KeithS

    2

    試してみてください:

    public ApplicationViewModel SelectedApplication 
        { 
         get 
         { 
          if (InvokeRequired) 
          { 
           BeginInvoke(() => { return SelectedApplication(); }); 
          } 
    
          return _applicationsCombobox.SelectedItem as ApplicationViewModel; 
         } 
        } 
    
    +0

    ありがとうございますが、今度は「SelectedApplication();メソッドで「メソッド、イベント、またはデリゲートが必要です」と表示されます。 – Gui

    3

    BeginInvokeと、デリゲートを取る

    public ApplicationViewModel SelectedApplication 
        { 
         get 
         { 
          if (InvokeRequired) 
          { 
           BeginInvoke((Action<ApplicationViewModel>)SelectedApplication); 
          } 
    
          return _applicationsCombobox.SelectedItem as ApplicationViewModel; 
         } 
        } 
    

    私がエラーを持っています。

    あなたは間違ったことの

    return (ApplicationViewModel)Invoke(new Func<object>(() => applicationsCombobox.SelectedItem));