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

本文关键字:类型 System Delegate 转换 lambda 表达式 | 更新日期: 2023-09-27 18:26:29

这些都不起作用:

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

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

_uiDispatcher = Dispatcher.CurrentDispatcher;

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

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

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

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

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

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

扩展一下其他答案。

不带参数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}";
}));

等等...

除非我错过了什么,否则您告诉我们的只是这不是 WPF 应用程序。我不认为调度程序是正确的类。

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

相关文章: