无法将lambda表达式转换为'System.Delegate'类型

时间:2012-03-03 19:56:47

标签: c# multithreading dispatcher

这些都不起作用:

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

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

_uiDispatcher = Dispatcher.CurrentDispatcher;

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

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

4 个答案:

答案 0 :(得分:62)

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

如果您的委托不接受任何参数并且不返回任何参数,则可以使用ActionMethodInvoker。试试这个:

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

答案 1 :(得分:4)

 this.Dispatcher.Invoke((Action)(() => { textBox1.Text = "Test 123"; }));

答案 2 :(得分:1)

除非我错过了什么,否则你告诉我们的是不是WPF应用程序。我不认为Dispatcher是正确使用的类。

如果这是一个WinForm应用程序,可以通过WindowsFormsSynchronizationContext

访问您的UI线程

答案 3 :(得分:0)

稍微扩展其他答案。

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}";
}));

等等...