带属性 getter 的 C# InvokeRequired

发布于 2024-11-28 02:24:58 字数 533 浏览 0 评论 0原文

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

I would like to make my getter thread safe. When I do this, I get an error:

public ApplicationViewModel SelectedApplication
    {
        get
        {
            if (InvokeRequired)
            {
                BeginInvoke((Action<ApplicationViewModel>)SelectedApplication);
            }

            return _applicationsCombobox.SelectedItem as ApplicationViewModel;
        }
    }

I have the error:

Cannot cast expression of type 'Foo.Model.ApplicationViewModel' to type 'Action<ApplicationViewModel>'

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

寂寞花火° 2024-12-05 02:25:00

BeginInvoke 接受委托。

你可以写

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

BeginInvoke takes a delegate.

You can write

return (ApplicationViewModel)Invoke(new Func<object>(() => applicationsCombobox.SelectedItem));
拒绝两难 2024-12-05 02:25:00

尝试:

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

            return _applicationsCombobox.SelectedItem as ApplicationViewModel;
        }
    }

Try:

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

            return _applicationsCombobox.SelectedItem as ApplicationViewModel;
        }
    }
戈亓 2024-12-05 02:24:59

很多事情都是错误的:

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

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

Lots of things wrong:

  • you cannot use BeginInvoke, Invoke is required
  • you cannot use Action<>, you are returning a value so Func<> is required
  • you cannot also run the original code after invoking, else is required.

Which produces:

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

Hiding the thread context switches in a low-level property is usually a mistake. Invoking has lots of overhead, the resulting code may end up being very slow without a good hint of why it is so slow.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文