事件侦听器代码将在触发事件的线程上隐式运行,因此事件侦听器不是线程绑定的。
如果您想在 UI 中显示事件处理的结果,您应该自己进行编组。像这样的东西:
void OnEvent(object sender, EventArgs args)
{
// runs in the event sender's thread
string x = ComputeChanges(args);
Dispatcher.BeginInvoke((Action)(
() => UpdateUI(x)
));
}
void UpdateUI(string x)
{
// runs in the UI thread
control.Content = x;
// - or -
new DialogWindow() { Content = x, Owner = this }.ShowDialog();
// - or whatever
}
所以:你最好在后台线程中执行你的计算(如果有的话),而不接触 UI;之后,当您知道 UI 中需要更改哪些内容时,您可以在 UI 线程中执行 UI 更新代码。
是控件的Dispatcher属性,因此如果您的代码是 UI 的一部分,您将免费获得 Dispatcher。否则,您可以从任何控件(例如control.Dispatcher)中获取调度程序。