2

我想让我的 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>'
4

3 回答 3

6

很多事情都错了:

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

在低级属性中隐藏线程上下文切换通常是一个错误。调用有很多开销,生成的代码最终可能会非常慢,而没有很好的提示为什么它这么慢。

于 2011-08-04T17:17:22.147 回答
3

BeginInvoke接受代表。

你可以写

return (ApplicationViewModel)Invoke(new Func<object>(() => applicationsCombobox.SelectedItem));
于 2011-08-04T17:12:59.767 回答
2

尝试:

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

            return _applicationsCombobox.SelectedItem as ApplicationViewModel;
        }
    }
于 2011-08-04T17:07:53.223 回答