我想让我的 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>'
最佳答案
很多地方都错了:
- 您不能使用 BeginInvoke,
Invoke
是必需的 - 你不能使用 Action<>,你返回的值是
Func<>
是必需的 - 您不能在调用后也运行原始代码,
else
是必需的。
产生:
public ApplicationViewModel SelectedApplication
{
get
{
if (this.InvokeRequired)
return (ApplicationViewModel)this.Invoke(new Func<ApplicationViewModel>(() => this.SelectedApplication));
else
return _applicationsCombobox.SelectedItem as ApplicationViewModel;
}
}
在低级属性中隐藏线程上下文切换通常是一个错误。调用有很多开销,生成的代码最终可能会非常慢,而没有很好地提示为什么它这么慢。
关于C# InvokeRequired 与属性 getter ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6945574/