无法将 lambda 表达式转换为类型“System.Delegate”
本文关键字:类型 System Delegate 转换 lambda 表达式 | 更新日期: 2023-09-27 18:26:29
这些都不起作用:
_uiDispatcher.Invoke(() => { });
_uiDispatcher.Invoke(delegate() { });
我想做的只是在我的主 UI 线程上调用内联方法。所以我在主线程上调用了这个:
_uiDispatcher = Dispatcher.CurrentDispatcher;
现在我想从另一个线程在该线程上执行一些代码。我该怎么做?我是否使用了错误的语法?
请注意,这不是 WPF 应用程序;我已经引用了WindowsBase
,所以我可以访问Dispatcher
类。
问题是您没有提供要调用的委托的确切类型。 Dispatcher.Invoke
只需要一个Delegate
.是Action<T>
吗?如果是这样,T
是什么?是MethodInvoker
吗? Action
?什么?
如果您的委托不带任何参数且不返回任何内容,则可以使用 Action
或 MethodInvoker
。试试这个:
_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线程。