C#多线程网摘 2
C#中,可以使用Thread类来处理(包含创建,启动,挂起,恢复,终止等操作)线程。本文将介绍如何使用Thread类来创建与启动新线程。
Thread类类位于System.Threading命名空间中。
1、线程创建与启动
实例化一个Thread对象,就创建了一个新的线程。
线程创建后调用Start()方法便可以启动新线程。
下面给出一个使用Thread类创建和启动新线程的实例。
文章一开始,给出实例的完整代码,如下:
//完整的示例代码
//求和方法
static void CalcSum()
{
;
; i < ; i++)
{
sum += i;
== && i!=)
{
Console.WriteLine("workThread-->i={0}:sum={1}",i,sum);
}
}
}
//求差方法
static void CalcGap()
{
;
; i >= ; i--)
{
gap = i-;
== && i != )
{
Console.WriteLine("MainThread-->i={0}:gap={1}", i, gap);
}
}
}
static void Main(string[] args)
{
ThreadStart entry = new ThreadStart(CalcSum);//求和方法被定义为工作线程入口
Thread workThread = new Thread(entry);
workThread.Start();
CalcGap();//求差方法被主线程调用
}
在实例中,定义了两个方法,一个求和方法(CalcSum)和一个求差方法(CalcGap)。
求差方法在Main函数中被调用,这个很容易被看出,不做过多解释。
那么实例中的求和方法被谁调用了呢?回答这个问题前,我们需要对Thread类的实例化操作做个简单的说明。
Thread类在实例化时,需要给其构造函数传入一个参数,用于指定线程开始执行的方法(线程入口)。我们查看Thread类的定义,发现其构造函数有以下重载形式:

在这里,我们使用下面这个构造函数来实例化Thread对象(其他构造函数的使用会在后续博文中介绍):
public Thread(ThreadStart start);
该构造函数接受一个ThreadStart 类型的入参。
查看ThreadStart 类型的定义,如下:
public delegate void ThreadStart();
通过阅读定义,我们了解到,ThreadStart是一个委托类型,该委托类型封装的方法没有入参也没有返回值。
ThreadStart委托类型的定义同样位于System.Threading命名空间中。
到这里,我们可以简单总结一下Thread对象的实例化过程,包含以下步骤:
- 定义一个包含了要执行代码的方法,同时该方法必须具有和ThreadStart委托类型相同的签名(没有入参也没有返回值);
- 创建ThreadStart委托类型的委托实例;
- 实例化Thread对象,且将ThreadStart的委托实例作为入参传入Thread类的构造函数。
在本例中的求和方法与 ThreadStart委托类型具有相同的签名,且包含线程需要执行的操作,所以用它来创建ThreadStart委托的委托实例。
再将ThreadStart委托实例作为参数传入Thread构造函数实例化Thread对象。这样就可以告诉编译器线程入口为求和方法CalcSum()。一旦启动线程就会执行这个求和方法指定的操作序列。
实例化Thread对象代码如下:
ThreadStart entry = new ThreadStart(CalcSum);
Thread workThread = new Thread(entry);
static void CalcSum()
{
//do what you want
}
Thread类型的实例化也可以使用下面的形式来完成:
Thread workThread = new Thread(new ThreadStart(CalcSum));
本例中,传送给Thread类型构造函数的参数是ThreadStart类型的委托。其实,我们也可以采用匿名方法来完成前面Thread类的实例化操作,具体代码如下:
Thread workThread = new Thread(delegate()
{
;
; i < ; i++)
{
sum += i;
== && i != )
{
Console.WriteLine("workThread-->i={0}:sum={1}", i, sum);
}
}
});
或者:
Thread workThread = new Thread(delegate()
{
CalcSum();
});
接下来,启动线程,代码如下:
workThread.Start();
代码中的求差方法被Main函数调用,在主线程中被执行。
而求和方法作为工作线程workThread的入口,被工作线程调用。
这里给出两个方法主要是为了说明,此时确实存在两个线程在执行。
至于代码其他细节,这里不做过多解释,有兴趣的可以一探究竟,执行结果如下所示。

就到这里了。
C#多线程网摘 2的更多相关文章
- C#多线程网摘 1
1.每个窗体都有自己的都在不同的线程上运行,如果需要在窗体之间交互,就需要在线程之间交互. 2.当线程Sleep时,系统就退出执行队列一段时间,当睡眠结束时,系统会产生一个时钟中断,从而使线程回到执行 ...
- Feedly订阅Blog部落格RSS网摘 - Blog透视镜
网络信息爆炸的时代,如何更有效率地阅读文章,订阅RSS网摘,可以快速地浏览文章标题,当对某些文章有兴趣时,才点下连结连到原网站,阅读更详细的文章,Feedly Reader阅读器除了提供在线版订阅RS ...
- Bloglines订阅Blog部落格RSS网摘 - Blog透视镜
网络信息蓬勃发展,Blog部落格越来越普及,如果逐一地去浏览网站,势必费时费力,倘若信息可以自己送上门,那就可以节省不少时间,就好像看报纸的标题,有兴趣才点连结,进到网站浏览文章内容,Blogline ...
- TCP/IP协议头部结构体(网摘小结)(转)
源:TCP/IP协议头部结构体(网摘小结) TCP/IP协议头部结构体(转) 网络协议结构体定义 // i386 is little_endian. #ifndef LITTLE_ENDIAN #de ...
- Vim命令快捷键(网摘)
Vim命令快捷键(网摘) 原文出处:[?---->home]
- c#与C++类型转换网摘
转载自 C++和C#转换 https://www.cnblogs.com/zjoch/p/4147182.html c#与C++类型转换,网摘 //c++:HANDLE(void *) ...
- Delphi 中DataSnap技术网摘
Delphi2010中DataSnap技术网摘 一.为DataSnap系统服务程序添加描述 这几天一直在研究Delphi 2010的DataSnap,感觉功能真是很强大,现在足有理由证明Delphi7 ...
- Python入门及容易!网摘分享给大家!
Python:Python学习总结 背景 PHP的$和->让人输入的手疼(PHP确实非常简洁和强大,适合WEB编程),Ruby的#.@.@@也好不到哪里(OO人员最该学习的一门语言). Pyth ...
- 多线程学习-基础(十三)(学习参考·网摘) ArrayBlockingQueue源代碼解析(base jdk 1.8)
前记: 这个得首先声明一下,以下大部分内容均参考于:https://blog.csdn.net/wx_vampire/article/details/79585794,本随笔只作为学习作用,侵权删! ...
随机推荐
- Android Tips – 填坑手册
出于: androidChina http://www.androidchina.net/3595.html 学习 Android 至今,大大小小的坑没少踩,庆幸的是,在强大的搜索引擎与无私奉献的 ...
- js 仿phptrim
function trims(){ this.init = function(myarguments){ if(arguments.length===0){return false;} this.ar ...
- mysqld_safe启动报错 mysqld_safe The file /usr/local/mysql/bin/mysqld does not exist or is not executable
报错(如下),但是使用mysqld直接启动没有问题. 150718 00:03:38 mysqld_safe Logging to '/var/log/mysqld.log'. 150718 00:0 ...
- 超级迷宫 nabc
特点之一:益智模式 N 我们的游戏需要一点点益智答题使其精彩 A 在走迷宫的过程中,会遇到某一个点,出现一个益智小问题,答对即可通过 B 增加游戏的趣味性,吸引用户 C 答题游戏不少,前不久腾讯的手 ...
- 便携式文件夹加密器 lockdir 5.74
便携式文件夹加密器 lockdir 5.74下载地址 http://www.hoposoft.com/lock/ 注册码两枚: 注册名:Long 注册码:6088805000000E7E25F09A6 ...
- 最流行的JavaScript库jQuery不再支持旧版IE
直到JQuery2.0的发布,流行的jQuery JavaScript库到了一个重要里程碑.2.0版本比前任版本在大小上缩减了12%,但是更大的新闻是,jQuery 2.0不在对IE6,7,8三个版本 ...
- 深入了解css的行高Line Height属性
什么是行间距? 古时候我们使用印刷机来出来文字.印刷出来的每个字,都位于独立的一个块中. 行间距,即传说中控制两行文字垂直距离的东东.在CSS中,line-height被用来控制行与行之间垂直距离. ...
- HTML5基本元素初探
最近看了一些HTML5的基础知识,写了一些小案例,记录一下,方便查找. 1.新建的HTML5页面中显著的变化是:DOCTYPE声明变简洁(<!DOCTYPE html>) / <me ...
- Windows Store App 控件动画
在开发Windows应用商店应用时,开发工具中已经封装了大量的控件供开发人员使用,而其中有一部分控件,例如FlipView.ToolTip.ListView以及SemanticZoom等控件中已经默认 ...
- Mongodb异常关闭重启失败解决
情况再现,连接mongodb的网站没有关,直接关闭了mongodb的cmd窗口.再次打开mongodb出现失败. 解决办法:网上说是删除 *.lock文件,再进行 --repair ,最后再打开mon ...