gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 04:31:51 27 4
gpt4 key购买 nike

我正在构建一个聊天客户端,但不是 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com