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

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

using System.Threading; ///罗旭成
///2013-11-14
/// <summary> /// 响应开始按钮单击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
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);
}
}

效果图:

相信大家已经看出,此方法只能达到捕获、处理线程状态的效果,并不能把线程中的数据返回。也就是说,虽然我们捕获了线程状态,获取了关键数据,但这仍然是一种向下的深层调用,并没有向上层返回。比如,做不到把线程中的数据显示在界面上,那将用到委托技术。
C#通过接口与线程通信(捕获线程状态)介绍的更多相关文章
- Java并发编程扩展(线程通信、线程池)
之前我说过,实现多线程的方式有4种,但是之前的文章中,我只介绍了两种,那么下面这两种,可以了解了解,不懂没关系. 之前的文章-->Java并发编程之多线程 使用ExecutorService.C ...
- Java的Hook线程及捕获线程执行异常
import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.f ...
- java并发编程基础——线程通信
线程通信 当线程在系统内运行时,程序通常无法准确的控制线程的轮换执行,但我们可以通过一些机制来保障线程的协调运行 一.传统的线程通信 传统的线程通信主要是通过Object类提供的wait(),noti ...
- java多线程-线程通信
线程通信的目标是使线程间能够互相发送信号.另一方面,线程通信使线程能够等待其他线程的信号. 通过共享对象通信 忙等待 wait(),notify()和 notifyAll() 丢失的信号 假唤醒 多线 ...
- iOS-----线程同步与线程通信
线程同步与线程通信 多线程是有趣的事情,它很容易突然出现”错误情况”,这是由于系统的线程调度具有一定的随机性造成的.不过,即使程序偶然出现问题,那么是由于编程不当所引起的.当使用多个线程来访问同一个数 ...
- java多线程——线程通信
一.线程通信目标 1.线程通信的目标是使线程间能够互相发送信号 2.线程通信使线程能够等待其他线程的信号 二.几种方式 1.通过共享对象 2.忙等待 线程 B 运行在一个循环里,以等待信号 (不释放c ...
- Java多线程-同步:synchronized 和线程通信:生产者消费者模式
大家伙周末愉快,小乐又来给大家献上技术大餐.上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式. 一.同 ...
- 多线程 - 线程通信 suspend-resume wait-notify park-unpark 伪唤醒
线程通信(如 线程执行先后顺序,获取某个线程执行的结果等)有多种方式: 文件共享 线程1 --写入--> 文件 < --读取-- 线程2 网络共享 变量共享 线程1 --写入--> ...
- .net学习之多线程、线程死锁、线程通信 生产者消费者模式、委托的简单使用、GDI(图形设计接口)常用的方法
1.多线程简单使用(1)进程是不执行代码的,执行代码的是线程,一个进程默认有一个线程(2)线程默认情况下都是前台线程,要所有的前台线程退出以后程序才会退出,进程里默认的线程我们叫做主线程或者叫做UI线 ...
随机推荐
- 小记 js unicode 编码解析
原文:小记 js unicode 编码解析 var str = "\\u6211\\u662Funicode\\u7F16\\u7801"; 关于这样的数据转换为中文问题,常用的两 ...
- 使用CNN(convolutional neural nets)关键的一点是检测到的面部教程(四):学习率,学习潜能,dropout
第七部分 让 学习率 和 学习潜能 随时间的变化 光训练就花了一个小时的时间.等结果并非一个令人心情愉快的事情.这一部分.我们将讨论将两个技巧结合让网络训练的更快! 直觉上的解决的方法是,開始训练时取 ...
- Sql Server 2008R2版本中有关外键Foreign的使用
原文:Sql Server 2008R2版本中有关外键Foreign的使用 1. 在数据库设计的过程中往往会想让2张表进行关联而使用到Foreign从而加强2张表之间的约束(如图) 以前有个问题一直没 ...
- Linux而不必进入password登陆自己主动sshserver方法
使用OpenSSH在linux通过登陆sshserver时间,系统会提示您输入每次password,和用途vim 的netrw保存编辑后的每一个变化必须失去远程文件时,插件password,很多麻烦. ...
- linux_安装_安装编译phantomjs 2.0的方法_转
项目中要对数据公式webkit渲染,phantmjs 2.0的效果好比1.9好不少. 安装过程中 坑比较多. 转载文章: phantomjs 2.0最新版的官方不提供编译好的文件下载,只能自己编译,有 ...
- mysql_oracle_随机查询几条记录
数据库的随机查询SQL 1. Oracle,随机查询20条 select * from ( select * from 表名 order by dbms_random.value ) where ...
- python_基础学习_01_按行读取文件的最优方法
python 按行读取文件 ,网上搜集有N种方法,效率有区别,先mark最优答案,下次补充测试数据 with open('filename') as file: for line in file: d ...
- css+html简单的布局demo
于html介绍css作风.可以改变html块状布局,局更加美观.接下来看一个基础布局的小样例: <html> <head> <meta http-equiv=" ...
- IOS启动其他应用程序
从app1打开app2.主要的思路就是,能够为app2定义一个URL,在app1中通过打开这个URL来打开app2,在此过程中.能够传送一些參数. 在app1的代码中打开刚才定义的URL.代码例如以下 ...
- WinForm播放视频
原文:WinForm播放视频 1背景 这几天一老友要求我做个小软件,在WinForm播放视频.印象中微软有个WM控件直接可以使用,晚上研究下 2实现方式 2.1微软草根 最简单的方式,是直接使用微软的 ...