最近在写一个TCP通信程序,自定义了一个通信类TCPclient,用于客户端异步接收和发送网络消息。

TCPclient中定义了一个接收到新的网络消息事件:

  //收到新消息事件
public delegate void receiveNewNetworkMsgHandler( string networkMSG);
public event receiveNewNetworkMsgHandler receiveNewNetworkMsg;

在外部的窗体中订阅了此事件:

void thisClient_receiveNewNetworkMsg( string networkMSG);

起初是直接在这个函数中读取网络消息,并解析命令,然后触发窗体的LoginSuccess事件,LoginSuccess事件的委托函数会New一个 main 窗体

但是问题是这个new的main窗体总是无响应。

经过很长时间的摸索,终于得出以下结论

在自定义类中定义并触发事件,那么UI中的事件处理代码也就工作在自定义类线程中,访问UI中控件需要invoke
在此之前,我一直认为事件处理函数在哪个类,自然运行的时候就在相应的线程中执行,至此才明白错在哪里。

根据这条结论,自然就不能直接在thisClient_receiveNewNetworkMsg函数中直接进行命令的解析以及触发LoginSuccess事件,

所以现在在thisClient_receiveNewNetworkMsg函数中进行如下更改:

         public delegate void NetMsgDealHandler(string str);
void thisClient_receiveNewNetworkMsg( string networkMSG)
{
NetMsgDealHandler newMSG = new NetMsgDealHandler(NetMsgDeal);
BeginInvoke(newMSG, networkMSG);
}
         void NetMsgDeal(string networkMSG) {
XmlDocument xmldoc = new XmlDocument();
try { xmldoc.LoadXml(networkMSG); }
catch (Exception ex) { MessageBox.Show(string.Format("XML加载错误({1}):{0}", networkMSG, ex.Message)); return; }
XmlElement rootElement = xmldoc.ChildNodes[] as XmlElement;
XmlElement SecElement = rootElement.ChildNodes[] as XmlElement;
switch (SecElement.Name) {
case "login": {
if (SecElement.SelectSingleNode("cmd").InnerText == "") {
if (SecElement.SelectSingleNode("isSuccess").InnerText == "True") {
//触发LoginSuccess事件
this.loginSuccess(this);
}
else {
//触发loginFailed事件
this.LoginFailed(this);
}
}
} break; //此处省略若干行
default: { MessageBox.Show(string.Format("得到无法处理的消息:{0}", networkMSG)); return; }
}
}

现在再次执行main窗体不在无响应,问题成功解决!

C#多线程与UI响应 跨线程更新UI的更多相关文章

  1. (转).NET 4.5中使用Task.Run和Parallel.For()实现的C# Winform多线程任务及跨线程更新UI控件综合实例

    http://2sharings.com/2014/net-4-5-task-run-parallel-for-winform-cross-multiple-threads-update-ui-dem ...

  2. C# Winform 跨线程更新UI控件常用方法汇总(多线程访问UI控件)

    概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件的线程访问它”的异常.处理跨线程更新Winform UI控件常用的方法有4种:1. ...

  3. 简短总结一下C#里跨线程更新UI(转)

    摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI ...

  4. 简短总结一下C#里跨线程更新UI

    摘自: http://my.oschina.net/sdqxcxh/blog/53707 跨线程更新UI是写多线程程序尤其是通信类的程序经常遇到的问题,这里面主要的问题是冲突,比如数据线程想要更新UI ...

  5. Winform之跨线程更新UI

    Winform之跨线程更新UI 使用`Invoke`或者`BeginInvoke`与UI线程交互示例 参考及源码 使用Invoke或者BeginInvoke与UI线程交互示例 private void ...

  6. C# Winform 跨线程更新UI控件常用方法总结(转)

    出处:http://www.tuicool.com/articles/FNzURb 概述 C#Winform编程中,跨线程直接更新UI控件的做法是不正确的,会时常出现“线程间操作无效: 从不是创建控件 ...

  7. C# 跨线程更新 UI

    Winforms 跨线程更新 UI 在 Winforms 中, 所有的控件都包含 InvokeRequired 属性, 如果我们要更新UI,通过它我们可以判断是否需要调用 [Begin]Invoke. ...

  8. C# WinForms跨线程更新 UI

    与在Android中一样, 子线程中更新UI被认为是线程不安全的, 会抛出异常. 子线程返回UI线程中更新UI的一个方法为: 1, 捕获应用的UI线程的上下文; 2, 定义线程任务; 3, 定义线程任 ...

  9. C#利用委托跨线程更新UI数据

    转:http://www.2cto.com/kf/201206/136587.html 在使用C#的过程中,难免会用到多线程,而用多线程之后,线程如何与界面交互则是一个非常头疼的问题.其实不仅仅是界面 ...

随机推荐

  1. Java再学习——深究static关键字

    一.static关键字的用途 可以在没有创建对象的情况下来进行(方法/变量)调用.也就是,被static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问. ...

  2. selenium 一个简单的流程

    在整个自动化测试过程中需要分为及部分:      1.初始化      2.结束      3.异常处理      4.截图      5.对弹窗的处理      6.测试用例   整个过程中需要包括 ...

  3. 计算机网络中的TCP/UDP协议到底是怎么回事(一)

    TCP/IP五层网络结构模型 物理层:物理层建立在物理通信介质的基础上,作为系统和通信介质的接口,用来实现数据链路实体间透明的比特 (bit) 流传输.只有该层为真实物理通信,其它各层为虚拟通信 数据 ...

  4. 自定义强大的C#网络操作基础类(NetHelper)

    using System; using System.Text;using System.Net.Sockets;using System.Net.Mail;using System.Net; nam ...

  5. 1.4.8 拼凑在一起(putting the pieces together)

    putting the pieces together 在最高的级别,schema.xml结构如下, <schema> <types> <fields> <u ...

  6. 2dx解析cocosbuilder中使用layer时的缺陷

    2dx解析cocosbuilder中使用layer时的缺陷 cocos2d-x 3.7 cocosbuilder中的layer通常会用到触摸属性: 但是在2dx解析布局文件的时候,却很多属性都没解析: ...

  7. nodejs的mysql模块学习(五)数据库连接配置之SSL

    SSL选项 在SSL连接选项中需要一个字符串 或者对象 当是字符串的时候 将使用预定义的SSL配置文件 "Amazon RDS" 只有这一个预定义配置文件 用来连接到亚马逊RDS服 ...

  8. CSDN中根据文章自动生成文章目录

    概述 CSDN中有根据文件内容中H标签在文章中自动生成文章目录,看起来比较专业,就想把它搬到自己的博客园中.类似下图 提取JS脚本 通过浏览器开发者工具(IE/Chrome)找到产生文章目录javas ...

  9. Spark installation for windows

    download spark from spark.apache.org download hadoop from hadoop.apache.org download hadoop.dll and ...

  10. Ios入门

    storyboard 文件的认识 用来描述软件界面 默认情况下程序启动就会加载Main.storyboard 加载storyboard时,会首先创建和显示箭头所指向的控制器界面 什么是UIscroll ...