getter 스레드를 안전하게 만들고 싶습니다. 나는이 작업을 수행 할 때 오류가 발생합니다 :C# InvokeRequired with property getter
Cannot cast expression of type 'Foo.Model.ApplicationViewModel' to type 'Action<ApplicationViewModel>'
getter 스레드를 안전하게 만들고 싶습니다. 나는이 작업을 수행 할 때 오류가 발생합니다 :C# InvokeRequired with property getter
Cannot cast expression of type 'Foo.Model.ApplicationViewModel' to type 'Action<ApplicationViewModel>'
로트을 작성할 수 있습니다
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;
}
}
스레드 컨텍스트가 낮은 수준의 속성에 스위치를 숨기기는 일반적으로 실수입니다. 호출하는 데 많은 오버 헤드가 발생하므로 결과 코드가 왜 느려지는지 알지 못하면 매우 느려질 수 있습니다.
시도 :
public ApplicationViewModel SelectedApplication
{
get
{
if (InvokeRequired)
{
BeginInvoke(() => { return SelectedApplication(); });
}
return _applicationsCombobox.SelectedItem as ApplicationViewModel;
}
}
감사하지만 이제는 : SelectedApplication() 메서드에서 "메서드, 이벤트 또는 대리인이 필요합니다"라고 표시됩니다. – Gui
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));
소비자에게 투명하다는 점을 제외하고는; 다른 메소드는이 속성을 동기식으로 가져 오기 위해 어떻게 호출되었는지주의해야합니다. 발신자가 UI 스레드에 있었는지 100 % 확실한 경우에만 속도 저하를 줄일 수 있습니다. – KeithS