C#使用属性getter调用InvokeRequired

时间:2011-08-04 17:05:27

标签: 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>'

3 个答案:

答案 0 :(得分:6)

很多错误:

  • 您无法使用BeginInvoke, Invoke 是必需的
  • 您无法使用操作&lt;&gt;,您将返回一个值,因此需要 Func<>
  • 您无法在调用后运行原始代码, else 是必需的。

产生:

public ApplicationViewModel SelectedApplication
{
    get
    {
        if (this.InvokeRequired)
            return (ApplicationViewModel)this.Invoke(new Func<ApplicationViewModel>(() => this.SelectedApplication));
        else
            return _applicationsCombobox.SelectedItem as ApplicationViewModel;
    }
}

隐藏线程上下文切换到低级属性通常是一个错误。调用有很多开销,结果代码可能会很慢,但没有很好的暗示它为什么这么慢。

答案 1 :(得分:3)

BeginInvoke需要代表。

你可以写

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

答案 2 :(得分:2)

尝试:

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

            return _applicationsCombobox.SelectedItem as ApplicationViewModel;
        }
    }