这些都不起作用:
_uiDispatcher.Invoke(() => { });
_uiDispatcher.Invoke(delegate() { });
我想要做的就是在我的主UI线程上调用内联方法。所以我在主线程上调用了这个:
_uiDispatcher = Dispatcher.CurrentDispatcher;
现在我想从另一个线程在该线程上执行一些代码。我该怎么做?我使用了错误的语法吗?
请注意,这不是 WPF应用程序;我引用了WindowsBase
,因此我可以访问Dispatcher
类。
答案 0 :(得分:62)
问题是您没有提供要调用的委托的确切类型。 Dispatcher.Invoke
只需Delegate
。它是Action<T>
吗?如果是,那么T
是什么?是MethodInvoker
吗? Action
?什么?
如果您的委托不接受任何参数并且不返回任何参数,则可以使用Action
或MethodInvoker
。试试这个:
_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}";
}));
等等...