C# InvokeRequired 与属性 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>'

最佳答案

很多地方都错了:

  • 您不能使用 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/

相关文章:

vb.net - VB-如何从在另一个线程(串行对象)上运行的类访问数据

.NET 调用流程

c# - 语法错误 : Missing operand before '=' operator

C#相当于Objective-C的dispatch_group和queue?

c# - 无法在 CentOS amd64 上执行二进制文件

c# - 清理散落着 InvokeRequired 的代码

c# - 在多个客户端使用它的情况下保护 ASP.NET Web API 2 的最佳方法

c# - 点击datagrid View 的按钮列,一封自动邮件将被发送到邮件id

c# - SynchronizationContext 和 InvokeRequired