【问题标题】:Cannot convert lambda expression to type 'System.Delegate'无法将 lambda 表达式转换为类型“System.Delegate”
【发布时间】:2012-03-03 19:56:46
【问题描述】:

这些都不起作用:

_uiDispatcher.Invoke(() => { });
_uiDispatcher.Invoke(delegate() { });

我要做的就是在我的主 UI 线程上调用一个内联方法。所以我在主线程上调用了这个:

_uiDispatcher = Dispatcher.CurrentDispatcher;

现在我想从另一个线程在该线程上执行一些代码。我该怎么做?我是否使用了错误的语法?

请注意,这不是 WPF 应用程序;我已经引用了WindowsBase,所以我可以访问Dispatcher 类。

【问题讨论】:

  • _uiDispatcher 是什么类型?你使用了 UI 的同步对象吗?
  • uiDispatcher 是msdn.microsoft.com/en-us/library/… 的一个实例。我认为这是 _uiDispatcher = Dispatcher.CurrentDispatcher 隐含的。 “用户界面”没有同步对象 AFAIK....但是我将如何使用它?这对我有什么好处?
  • 啊...好吧,我认为线程调度程序不会工作。这是一个 WinForm 应用程序吗?

标签: c# multithreading dispatcher


【解决方案1】:

问题是您没有提供要调用的委托的确切类型。 Dispatcher.Invoke 只需要一个 Delegate。是Action<T> 吗?如果是这样,T 是什么?是MethodInvoker 吗? Action?什么?

如果您的委托不接受任何参数并且不返回任何内容,您可以使用Action 或MethodInvoker。试试这个:

_uiDispatcher.Invoke(new Action(() => { }));

【讨论】:

  • 我想我已经习惯了大多数接受委托的方法都提供签名,所以我不需要指定一个。不过,这是有道理的。谢谢!
  • 我认为这并不像我想象的那样有效。该方法似乎永远不会被调用;我猜 WPF 通常会为您处理并定期执行这些方法?也许我应该只是一个Queue<Action> 然后自己管理这个......
【解决方案2】:
 this.Dispatcher.Invoke((Action)(() => { textBox1.Text = "Test 123"; }));

【讨论】:

    【解决方案3】:

    除非我遗漏了什么,否则您告诉我们的只是这不是 WPF 应用程序。我不认为 Dispatcher 是正确使用的类。

    如果这是一个 WinForm 应用程序,您的 UI 线程可以通过 WindowsFormsSynchronizationContext 访问

    【讨论】:

    • 它也不是 WinForm 应用程序;我正在使用 OpenGL。 OpenGL 使用 GL 上下文,您只能从创建它的同一线程中绘制它。我试图想出一种在主线程上运行一些东西的方法......我之前在 WPF 应用程序中使用过Dispatcher,所以我想我可以再次使用它来解决这个问题。
    【解决方案4】:

    稍微扩展其他答案。

    Action 不带参数:

    _uiDispatcher.Invoke(new Action(() =>
    {
        // Do stuff
        textBox1.Text = "Test 123";
    }));
    

    Action 带 1 个参数:

    _uiDispatcher.Invoke(new Action<bool>((flag) =>
    {
        if (flag)
        {
            // Do stuff
            textBox1.Text = "Test 123";
        }
    
    }));
    

    Action 带 2 个参数:

    _uiDispatcher.Invoke(new Action<int, string>((id, value) =>
    {
        // Do stuff
        textBox1.Text = $"{value} {id}";
    }));
    

    等等……

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      • 2011-06-23
      • 1970-01-01
      • 2023-01-07
      • 1970-01-01
      • 2016-04-15
      相关资源
      最近更新 更多