c# - 在 WPF 应用程序中使用 C# 调度程序

标签 c# wpf invoke dispatcher

我正在构建一个聊天客户端,但不是 100% 确定如何使用 dispatcher。所以问题是我有这样的方法:

public void LostConnection()
{
    myGUI.chatBox.AppendText("Lost connection to room: "+ myGUI.UsernameText.ToString() + "\r\n");
}

我是否需要用 Dispatcher.Invoke 包围 (myGUI.chatBox...) 中的语句?感谢您的帮助。

最佳答案

您的应用有一个主 UI 线程(通常是 ManagedThreadId==1)。通常在聊天应用程序中,您的事件将进入其他线程(专用套接字监听线程或来自监听代码的线程池线程)。如果你想从一个在其他线程上拉取的事件更新 UI,你必须使用调度程序。此处的一个有用测试是 Dispatcher.CheckAccess() 方法,如果代码在 UI 线程上,该方法返回 true,如果在其他线程上,则返回 false。典型的调用类似于:

using System.Windows.Threading; // For Dispatcher.

if (Application.Current.Dispatcher.CheckAccess()) {
    network_links.Add(new NetworkLinkVM(link, start_node, end_node));
}
else {
    Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(()=>{
        network_links.Add(new NetworkLinkVM(link, start_node, end_node));
    }));
}

如果您在主窗口中,您可以使用:

Dispatcher.BeginInvoke(...

如果您在其他上下文中,例如 View 模型,则使用:

Application.Current.Dispatcher.BeginInvoke(  

调用与 BeginInvoke
如果您希望当前线程等待 UI 线程处理完调度代码,请使用 Invoke,如果您希望当前线程继续运行而不等待 UI 上的操作完成,请使用 BeginInvoke线程。

MessageBox、Dispatchers 和 Invoke/BeginInvoke:
Dispatcher.Invoke 将阻塞您的线程,直到 MessageBox 被关闭。
Dispatcher.BeginInvoke 将允许您的线程代码继续执行,而 UI 线程将阻塞 MessageBox 调用,直到它被解除。

CurrentDispatcher 与 Current.Dispatcher!
请注意 Dispatcher.CurrentDispatcher,因为我对此的理解是将为当前线程而不是 UI 线程返回 Dispatcher。一般来说,您是否对 UI 线程上的调度程序感兴趣 - Application.Current.Dispatcher 总是返回它。

补充说明:
如果您发现您必须经常检查调度程序 CheckAccess,那么一个有用的辅助方法是:

public void DispatchIfNecessary(Action action) {
    if (!Dispatcher.CheckAccess())
        Dispatcher.Invoke(action);
    else
        action.Invoke();
}

可以称为:

DispatchIfNecessary(() => {
    network_links.Add(new NetworkLinkVM(link, start_node, end_node));
});

关于c# - 在 WPF 应用程序中使用 C# 调度程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7839296/

相关文章:

c# - 如何在 Silverlight 中为 zIndex 属性设置动画?

WPF ListBox 以不同方式显示最后一项

c# - 是否可以将 Appconfig 值作为对象调用?

c# - 使用 IPersistStreamInit 从 WPF-WebBrowser-Control 获取 HTML 源

c# - 还有其他类似的 ObservableCollection<T> 吗?

c# - WPF Dispatcher.Invoke 'hanging'

c# - 将命令插入到 C# 中的调用命令中

java - java中如何将对象的方法和对象作为单独的线程调用?

C# 多线程

c# - 在 C# 中使用正则表达式对列表元素进行排序