2011-08-04 6 views
2

getter 스레드를 안전하게 만들고 싶습니다. 나는이 작업을 수행 할 때 오류가 발생합니다 :C# InvokeRequired with property getter

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

소비자에게 투명하다는 점을 제외하고는; 다른 메소드는이 속성을 동기식으로 가져 오기 위해 어떻게 호출되었는지주의해야합니다. 발신자가 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; 
     } 
    } 

I 오류가 있습니다.

당신이 잘못 가지의

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