【发布时间】:2014-02-19 14:40:50
【问题描述】:
我天生就是一名网络和后端程序员。通常我会尽量避免制作 Windows 程序。现在我必须制作一个 WPF 客户端。
我有一个经常引发事件的后台任务。 (它像轮询器一样工作,当满足条件时会引发事件)。像我这样的菜鸟,我编写了附加到事件以更新 UI 的这段代码。
private void IsDisconnectedEvent()
{
UserWindow.Visibility = Visibility.Hidden;
DisconnectWindow.Visibility = Visibility.Visible;
}
这给出了一个例外,因为我不在同一个线程上。经过一番谷歌搜索后,我发现我应该更改代码:
private void IsDisconnectedEvent()
{
Dispatcher.Invoke(() =>
{
UserWindow.Visibility = Visibility.Hidden;
DisconnectWindow.Visibility = Visibility.Visible;
});
}
这行得通,但这不是唯一的事件,因此使我的代码丑陋得可怕。有没有更好的方法来做到这一点?
【问题讨论】:
-
您可以使用
BackgroundWorker。除此之外,Dispatcher.Invoke()是要走的路。此外,您可以将 Dispatcher 调用包装在一个方法中,例如PropagateChangesToUI(UIState newState) { Dispatcher.Invoke([...]); } -
当然,有很多机制可以更轻松地将代码编组到 UI 线程。它们专门用于各种任务,因此您使用的将取决于您在做什么。如果您正在更新进度,请使用
IProgress,如果您在一段时间后调用代码,请使用DispatcherTimer,如果您在后台线程中执行CPU 密集型工作,您可以使用BackgroundWorker。以此类推。