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

如何从另一个线程更新GUI上的文本框分享

时间:2023-04-10 22:53:58 C#

C#学习教程:如何从另一个线程更新GUI上的文本框我的客户端表单上有一个RichTextBox,我正在尝试从另一个类的服务器更新该控件。当我尝试这样做时,出现错误:“无效的跨线程操作:控制从创建它的线程以外的线程访问的textBox1”。这是我的窗体代码:privateTopictopic;公共RichTextBox文本框1;boolcheck=topic.addUser(textBoxNickname.Text,reftextbox1,reflistitems);主题类:公共类主题:MarshalByRefObject{//一些代码“连接到服务器...n”;}那么毛呢布做什么呢?如何从另一个线程更新文本框控件?我正在尝试使用.net远程处理来创建一些基本的聊天客户端/服务器应用程序。我想要一个Windows窗体客户端应用程序和一个控制台服务器应用程序作为单独的.exe文件。在这里,我试图从客户端调用服务器函数AddUser,我希望AddUser函数更新我的GUI。我已经按照你建议的使用Jon修改了代码,但现在没有跨线程异常,我得到了这个异常......“SerializationException:Assembly中的类型主题未标记为可序列化”。我会尽量保持我的整个代码尽可能简单。欢迎提出任何建议。太感谢了。服务器:namespaceTest{[Serializable]publicclassTopic:MarshalByRefObject{publicboolAddUser(stringuser,RichTextBoxtextBox1,ListlistBox1){//只发送消息给连接的客户端MethodInvokeraction=delegate{textBox1.Text+="Connected到服务器...n";};textBox1.BeginInvoke(动作);//...返回真;}publicclassTheServer{publicstaticvoidMain(){intlisteningChannel=1099;BinaryServerFormatterSinkProvidersrvFormatter=newBinaryServerFormatterSinkProvider();srvFormatter.TypeFilterLevel=TypeFilterLevel.Full;BinaryClientFormatterSinkProviderclntFormatter=newBinaryClientFormatterSinkProvider();IDictionaryprops=newHashtable();道具[“端口”]=listeningChannel;HttpChannel通道=newHttpChannel(props,clntFormatter,srvFormatter);//向运行时注册通道ChannelServices.RegisterChannel(channel,false);//从此服务器公开计算器对象RemotingConfiguration.RegisterWellKnownServiceType(typeof(Topic),"Topic.soap",WellKnownObjectMode.Singleton);//保持服务器运行,直到用户按下回车键Console.WriteLine("主题服务器已启动并在端口{0}"上运行,listeningChannel);Console.WriteLine("Pressentertostoptheserver...");控制台.ReadLine();}}}}Windows客户端://创建并注册一个与服务器通信的通道//客户端将使用作为参数传入的端口来监听回调BinaryServerFormatterSinkProvidersrvFormatter=newBinaryServerFormatterSinkProvider();srvFormatter.TypeFilterLevel=TypeFilterLevel.Full;BinaryClientFormatterSinkProviderclntFormatter=newBinaryClientFormatterSinkProvider();IDictionaryprops=newHashtable();道具[“港口”]=0;channel=newHttpChannel(props,clntFormatter,srvFormatter);//channel=newHttpChannel(listeningChannel);ChannelServices.RegisterChannel(channel,false);//在远程服务器上创建一个实例并远程调用一个方法topic=(Topic)Activator.GetObject(typeof(Topic),//typetocreate"http://localhost:1099/Topic.soap"//URI);私人话题主题;公共RichTextBox文本框1;boolcheck=topic.addUser(textBoxNickname.Text,textBox1,listitems);您需要使用BackgroundWorker或ControlInvoke/BeginInvoke。匿名函数-匿名方法(C#2.0)或lambda表达式(C#3.0)使这比以前更容易。在您的情况下,您可以将代码更改为:publicboolAddUser(stringuser,RichTextBoxtextBox1,ListlistBox1){MethodInvokeraction=delegate{textBox1.Text+="Connectedtoserver...n";};textBox1.BeginInvoke(动作);需要注意的几件事:有关此主题和其他线程主题的更多信息,请参阅我的线程教程或JoeAlbahari的线程主题。使用Invoke方法//更新文本框文本。privatevoidUpdateText(stringtext){//设置文本框文本。yourTextBox.Text=文本;现在,创建一个与之前定义的方法具有相同签名的委托:publicdelegatevoidUpdateTextCallback(stringtext);在您的线程中,您调用您的TextBox上的Invoke方法,将委托与参数一起传递给调用。以上是C#学习教程:如何从另一个线程更新GUI上文本框共享的所有内容。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——yourTextBox.Invoke(newUpdateTextCallback(this.UpdateText),newobject[]{”非UI线程生成的文本”});本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: