【问题标题】:Dispatcher.Invoke with anonymous delegate works in Silverlight but not WPFDispatcher.Invoke 与匿名委托在 Silverlight 但不是 WPF
【发布时间】:2010-07-19 19:56:42
【问题描述】:

在 Silverlight 4 中,我有一个自定义服务类,它有一个异步 Completed 事件。在 Completed 事件中,我获取返回的数据并通过以下方式调用填充方法:

private void service_Completed(object sender, CompletedEventArgs args)
{
    Dispatcher.BeginInvoke(() => populateInbox(args.Jobs));
}

private void populateInbox(List<JobViewModel> jobs)
{
    inbox.DataContext = jobs;
}

BeginInvoke 在 SL4 中工作,但是当我将它移植到 WPF 时,我收到以下错误:

无法将 lambda 表达式转换为类型“System.Delegate”,因为它不是委托类型

我尝试将其更改为内联、匿名、参数化的委托:

Dispatcher.BeginInvoke(delegate(List<JobViewModel> jobs)
{
    inbox.DataContext = jobs;
});

但是,这会产生相同的编译时错误。

知道如何让它在 WPF 中工作吗?重构以使用 BackgroundWorker 对我来说不是一个选项。

【问题讨论】:

    标签: c# wpf asynchronous begininvoke anonymous-delegates


    【解决方案1】:

    您需要指定一个明确的委托类型。只需使用Action

    Dispatcher.BeginInvoke(new Action(() => populateInbox(args.Jobs));
    

    但是,您可以避免像这样关闭 args.Jobs 值:

    Dispatcher.BeginInvoke(new Action((jobs) => populateInbox(jobs)), jobs);
    

    这是因为Dispatcher.BeginInvoke 的单参数版本在 Silverlight 中的签名与在 WPF 中的签名不同。在 Silverlight 中,它需要一个 Action,它允许 C# 编译器将您的 lambda 隐式键入为 Action。在 WPF 中,它采用 Delegate(就像 Winforms 中的 Control.BeginInvoke 模拟),因此 C# 编译器必须明确指定委托类型。

    【讨论】:

    • 我现在收到此错误:非静态字段、方法或属性需要对象引用 'System.Windows.Threading.Dispatcher.BeginInvoke(System.Delegate, params object[ ])'。我将它分成 2 行以尝试查看导致错误的原因。 var d = new Action(() => populateInbox(args.Jobs)); Dispatcher.BeginInvoke(d, args.Jobs);错误发生在第 2 行。
    • Dispatcher.BeginInvoke(d, new object[] { args.Jobs });也不行。
    • @Edward:Dispatcher 不是静态类。您必须在具有 Dispatcher 属性的 UI 元素的上下文中调用此函数,或者您必须将调度程序作为另一个参数传递。
    • 是的,你是对的。我正在尝试在 Excel 工作簿项目中使用 WPF 用户控件。 WPF 用户控件托管在具有 ElementHost 的 ActionPane 中。该窗格在没有 Dispatcher 属性的 Ribbon 控件中实例化。谢谢。
    【解决方案2】:

    在 WPF 和 winforms 中,您必须先将其强制转换为 MethodInvoker,否则您将收到错误无法将匿名方法转换为类型“System.Delegate”,因为它不是委托类型。 p>

    Dispatcher.BeginInvoke((MethodInvoker) delegate(List<JobViewModel> jobs)
    {
       inbox.DataContext = jobs;
    });
    

    欲了解更多信息:http://msdn.microsoft.com/en-us/library/system.windows.forms.methodinvoker.aspx

    【讨论】:

      猜你喜欢
      • 2010-11-01
      • 2010-11-01
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多