当前位置: 首页 > 编程语言 > C#

如何使用来自后台线程的信息更新WPF窗口?Share

时间:2023-04-10 15:48:38 C#

如何使用来自后台线程的信息更新WPF窗口?我正在创建一个wpf应用程序,它在幕后执行许多任务,但仍然需要UI响应并显示各种后台任务的状态。它还可以选择不显示UI,在这种情况下应该丢弃状态消息,并且根本不创建主窗体的实例。我试图从App.xaml中删除StartupUri="MainWindow.xaml"。然后,在App.xaml.cs中,我有`publicApp(){Startup+=newStartupEventHandler(App_Startup);}voidApp_Startup(objectsender,StartupEventArgse){//加载应用程序设置的代码在这里if(pf.ShowUI){MainWindowmainWindow=newMainWindow();mainWindow.Show();}//后台进程将从这里开始。}`这将显示主窗口并在必要时启动任何后台进程。这部分有效。为了从后台向UI发送消息,我实现了一个非常基本的信使:`internalinterfaceIMessageHandler{voidReceiveMessage(stringmessage);}内部类Messenger{privatestaticList_handlers;内部静态无效AddHandler(IMessageHandler处理程序){_handlers。添加(处理程序);}internalstaticvoidRemoveHandler(IMessageHandlerhandler){try{_handlers.删除(处理程序);}catch(Exceptionex){}}internalstaticvoidBroadcast(stringmessage){foreach(IMessageHandlerhandlerin_handlers){handler.ReceiveMessage(message);}}}`主窗体实现了IMessageHandler接口,并在启动时将自己添加到Messenger作为处理程序。任何需要向主窗体发送状态的进程只需要调用信使的Broadcast方法。我遇到的问题是消息没有显示在表单上,??并且UI也被锁定,直到后台进程完成。UI中处理接收消息的代码如下:}privatevoidAddText(stringtext){LabelmyLabel=newLabel();myLabel.Content=文本;stackPanel1.Children.Add(myLabel);如果(stackPanel1.Children.Count>5){stackPanel1.Children.RemoveAt(0);}}`为什么我的后台进程会冻结我的UI?我能做些什么来防止它?为什么我的UI没有更新状态消息?我遇到了同样的问题,这篇博文为我解决了这个问题。也许这是你的问题:Dispatcher.Invoke(DispatcherPriority.Normal,newAction(AddText),message);尝试将其更改为Dispatcher.BeginInvoke(DispatcherPriority.Normal,newAction(AddText),message);因为当您使用Invoke时,该方法将被执行并且应用程序等待它完成,但是使用BeginInvoke时该方法被异步调用,并且应用程序在执行BeginInvoke引用的方法的同时继续执行。阅读:是使用Invoke还是BeginInvoke使用下面的代码来避免冻结UI。在我的应用程序中,我使用BackgroundWorker类。通过使用代码更改表单上的任何内容,将引发运行时错误。我使用下面的代码来避免这种情况,它非常适合我。Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Normal,newAction(delegate(){rtf_status.AppendText("正在根据模式验证XML...请稍候");}));请注意,如果您希望更改表单中的某些内容,则应放置花括号('{}')代码之间的部分。以上就是C#学习教程:如何用后台线程中的信息更新WPF窗口?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: