2011-08-04 57 views
2

我想讓我的getter線程安全。當我這樣做,我得到一個錯誤:C#InvokeRequired屬性getter

public ApplicationViewModel SelectedApplication 
    { 
     get 
     { 
      if (InvokeRequired) 
      { 
       BeginInvoke((Action<ApplicationViewModel>)SelectedApplication); 
      } 

      return _applicationsCombobox.SelectedItem as ApplicationViewModel; 
     } 
    } 

我有錯誤:

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

回答

6

許多事情不對:

  • 不能使用的BeginInvoke,Invoke需要
  • 你不能用行動<>,你是返回一個值所以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

除對消費者透明外,沒有其他方法必須關心它如何被調用以便以同步的方式獲得該屬性。在100%確定調用者在UI線程中的情況下,您只能減少放慢速度。 – KeithS

2

嘗試:

public ApplicationViewModel SelectedApplication 
    { 
     get 
     { 
      if (InvokeRequired) 
      { 
       BeginInvoke(() => { return SelectedApplication(); }); 
      } 

      return _applicationsCombobox.SelectedItem as ApplicationViewModel; 
     } 
    } 
+0

謝謝,但現在它說:「方法,事件或代表預期」的方法SelectedApplication(); – Gui

3

BeginInvoke需要委託。

你可以寫

return (ApplicationViewModel)Invoke(new Func<object>(() => applicationsCombobox.SelectedItem)); 
相關問題