当前位置:  编程技术>.net/c#/asp.net

C#通过接口与线程通信(捕获线程状态)示例代码

    来源: 互联网  发布时间:2014-10-24

    本文导语:  提示:本文所提到的线程状态变化,并不是指线程启动、暂停、停止,而是说线程内部状态的迁移。随着软件技术不断发展,用户需求不断提升,多线程的重要性日益凸显。 关于线程,通俗的讲,每当启动一个exe应用程序,都...

提示:本文所提到的线程状态变化,并不是指线程启动、暂停、停止,而是说线程内部状态的迁移。随着软件技术不断发展,用户需求不断提升,多线程的重要性日益凸显。

关于线程,通俗的讲,每当启动一个exe应用程序,都会创建一个进程和一个主线程,主线程用来处理界面绘制、界面事件响应等工作,而进程则是线程的容器,主线程和用户创建的新线程,都将在相应的进程中维护。由此可知,一个程序之所以能工作,是线程的功劳,进程仅仅是容器而已,一旦程序的主线程被阻塞,就会造成界面无响应等现象,这时候就要用多线程解决问题。然而,在程序中使用多线程,是比较头疼的一件事。以我的体会,多线程首先会造成程序不稳定,处理不好容易导致程序崩溃。其次,多线程控制并不是那么容易,比如线程状态监控、线程访问冲突等等。最后,还有一个线程通信问题,线程和线程之间的数据交互、消息通知等,并不是那么容易,往往涉及高级知识,比如委托。很多情况下,我们希望能获得线程的“返回值”,也就是能够获得线程中的数据,当线程内部状态发生改变时,我们能及时获取关键数据,来进行不同的处理。遗憾的是,线程是没有返回值的,在线程中运行的方法,返回值必须是void,但可以有参数。本文就从这个角度出发,通过一个简单的小技巧,及时捕获线程状态变化,并且获得关键数据。

简单的解释一下,核心思想:通过定义接口,来规范线程参数,当线程内部状态迁移时,调用接口中定义的对应处理方法,达到捕获线程状态的目的,同时也能获得线程内部关键数据。

代码实现如下:

winform窗体中的代码(对应线程相关类):

代码如下:

using System.Threading;

 ///罗旭成
 ///2013-11-14
 ///

 /// 响应开始按钮单击事件
 ///
 ///
 ///
 private void btnStart_Click(object sender, EventArgs e)
 {
     //实例化ThreadNotice类对象,ThreadNotice类实现了IThreadNotice接口
     IThreadNotice tn = new ThreadNotice();
     //实例化一个Thread对象,并且指定该Thread对象执行Run方法
     Thread th = new Thread(Run);
     //启动线程,并且传入线程方法(Run)需要的一个参数
     //注意,这里最多能传入一个参数!!并且要求线程方法的参数为Object类型!!
     th.Start(tn);
 }

 //线程中运行的方法
 void Run(Object obj)
 {
     //将对象转换成接口类型
     IThreadNotice tn = (IThreadNotice)obj;
     //假设状态为1,则调用实现IThreadNotice接口类的状态1处理方法,并传入状态1下的数据
    tn.ThreadEvent1("状态1");
     //假设为状态2,则调用实现IThreadNotice接口类的状态2处理方法,并传入状态2下的数据
     tn.ThreadEvent2("状态2");
 }

线程状态处理接口:

代码如下:

///罗旭成
///2013-11-14
//线程状态通知接口
 public interface IThreadNotice
 {
     //状态1处理方法
     void ThreadEvent1(string msg);
     //状态2处理方法
     void ThreadEvent2(string msg);
 }

状态处理类:

代码如下:

using System.Diagnostics;

///罗旭成
///2013-11-14
//ThreadNotice类实现了IThreadNotice接口
 public class ThreadNotice:IThreadNotice
 {
     //ThreadNotice类对于状态1的处理
     public void ThreadEvent1(string msg)
    {
         Debug.WriteLine("ThreadNotice类处理——" + msg);
     }


     //ThreadNotice类对于状态2的处理
     public void ThreadEvent2(string msg)
     {
         Debug.WriteLine("ThreadNotice类处理——" + msg);
     }
 }



相信大家已经看出,此方法只能达到捕获、处理线程状态的效果,并不能把线程中的数据返回。也就是说,虽然我们捕获了线程状态,获取了关键数据,但这仍然是一种向下的深层调用,并没有向上层返回。比如,做不到把线程中的数据显示在界面上,那将用到委托技术。


    
 
 

您可能感兴趣的文章:

  • 能否通过线程id控制线程的状态?或是观察到线程的状态?
  • 输出java进程的jstack信息示例分享 通过线程堆栈信息分析java线程
  • 线程间可否通过管道传递SOCKET句柄?还有其他方式传递SOCKET么?
  • 通过线程 如可监控tomcat是否正常 重启tomcat
  • 除了全局变量,线程还可以通过哪些方法向定时器传递数据?
  • 同多个线程通过同一个socket发送数据,操作系统底层会同步每个发送操作吗
  • 关于线程创建函数的一个简单问题(编译未通过)
  • java通过共享变量结束run停止线程的方法示例
  • 通过如下函数能否实现errno是线程安全的?
  • 请教线程之间通过优先级的高低来判断由哪个线程来执行!
  • 小弟编了一个非常简化的多线程模拟电梯程序,编译通过,可是运行啥结果也没有,请高手指点!
  • linux多线程编程详解教程(线程通过信号量实现通信代码)
  • c#通过委托delegate与Dictionary实现action选择器代码举例
  • C#通过反射创建自定义泛型
  • .NET下 c#通过COM组件操作并导出Excel实例代码
  • c#通过unicode编码判断字符是否为中文示例分享
  • C# datatable 不能通过已删除的行访问该行的信息处理方法
  • c# 通过经纬度查询 具体的地址和区域名称
  • c#通过httphandler添加水印的代码
  • c#通过进程调用cmd判断登录用户权限代码分享
  • C#实现通过winmm.dll控制声音播放的方法
  • C#通过IComparable实现ListT.sort()排序
  • c#通过ip获取地理信息
  • c# HttpWebRequest通过代理服务器抓取网页内容应用介绍
  • C#实现通过程序自动抓取远程Web网页信息的代码
  • 通过C#调用cmd来修改服务启动类型
  • C#通过WIN32 API实现嵌入程序窗体
  • C#通过XML节点属性/属性值读取写入XML操作代码实例
  • C#实现通过模板自动创建Word文档的方法
  • C#通过经纬度计算2个点之间距离的实现代码
  • c#通过xpath读取xml示例
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 通过套接字捕获数据包,如何捕获大多数(全部)的通过网卡的包,并要求显示MAC地址和IP地址
  • 如何通过程序捕获控制台下的屏幕的内容?
  • 通过javascript实现DIV居中,兼容各浏览器版本
  • applet可以不通过数字签名,通过设置IE直接在本地访问本地文件吗
  • php通过socket_bind()设置IP地址代码示例
  • 我使用.net编译通过,但是使用g++编译不能通过。总是提示我undefined reference to ~myclass()
  • 通过javascript库JQuery实现页面跳转功能代码
  • 紧急求救!能通过jdbc怎样连接sqlsever 然后通过 for xml 关键字得到xml流吗?
  • linux下通过crond实现自动执行程序
  • 我想我的网站屏蔽掉通过某些网站过来的访问,我想通过htaccess 文件来做,请大家帮帮我。
  • 通过docker commit命令保存对docker容器的修改
  • 如何通过INTERNET访问通过共项一条线路上网的局域网中的机器???
  • 通过docker run命令运行新的docker镜像
  • 为什么g++编译通过了,而gcc却编译通过不了???
  • 通过docker ps命令检查运行中的docker镜像
  • 请指点: 在windows下能否通过程序来获取linux下的用户列表,甚至通过自己写的windows程序界面增加修改linux的用户
  • Session id实现通过Cookie来传输方法及代码参考
  • Jbuilder第一次编译说缺包,引入通过!然后把原来引入的注释,又通过!上帝,救我!
  • 通过docker search命令搜索可用docker镜像
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • Python3通过request.urlopen实现Web网页图片下载
  • 请指点: 在windows下能否通过程序来获取linux下的用户列表,甚至通过自己写的windows程序界面增加修改linux的用户 100分相赠
  • Python通过正则表达式获取,去除(过滤)或者替换HTML标签的几种方法
  • 工作站Redhat Linux7.2如何通过NT4.0 proxy代理服务器上网,我不能通过其验证!请高手指点思路和方法!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3