点点滴滴
访问量:
sopper
博客园
首页
新随笔
新文章
联系
订阅
管理
posts - 84,comments - 115,trackbacks - 5
<
2008年6月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
留言簿
(5)
给我留言
查看留言
我参与的团队
北京.NET俱乐部(2/1447)
开源GIS学习(2/241)
我的标签
socket
(1)
线程
(1)
随笔档案
2008年6月 (1)
2008年5月 (2)
2008年4月 (1)
2008年3月 (3)
2008年2月 (1)
2008年1月 (2)
2007年12月 (9)
2007年11月 (1)
2007年6月 (7)
2007年5月 (3)
2007年3月 (8)
2007年1月 (15)
2006年12月 (2)
2006年11月 (8)
2006年10月 (1)
2006年4月 (19)
收藏夹
blog(2)
C#blog友情连接
C# Open Source
a
www.oazabir.com
开心就好【博客堂】
清清月儿
天道酬勤
最新随笔
1. 瑞星版本20.49.30的Bug
2. C++控件的数据交换和数据校验
3. VC6类向导对窗体按钮添加的消息映射代码
4. c/c++下常见的内存错误及其对策
5. CORBA_TAO的环境配置
6. 再议ManualResetEvent
7. 异步socket的线程分配(C#)
8. 你知道main函数参数的用处吗?
9. 你能确定这段代码的输出结果吗?
10. 小技巧避免项目中的大隐患
积分与排名
积分 - 36901
排名 - 1094
最新评论
1. re: 瑞星版本20.49.30的Bug
解决办法:
3.卸载瑞星,改用NOD32
--游客
2. re: 瑞星版本20.49.30的Bug
瑞星近来的版本,测试不到位
--路人11
阅读排行榜
1. C# 里List的用法(3551)
2. c# MD5加密算法的实例(2323)
3. ManualResetEvent用法 (2023)
4. 构造函数(1854)
5. C#连接mysql(1810)
评论排行榜
1. C#连接mysql(14)
2. 最基本的Socket编程 C#版(14)
3. 小技巧避免项目中的大隐患(13)
4. c# MD5加密算法的实例(10)
5. ManualResetEvent用法 (9)
ManualResetEvent用法
转之:
http://blog.tom.com/blog/read.php?bloggerid=313638&blogid=13505
Thread and Sync In C# (C#中的线程与同步)
别相信别人告诉你的所有的事。其实C#中的线程是很简单的。
线程是程序中的控制流程的封装。你可能已经习惯于写单线程程序,也就是,程序在它们的代码中一次只在一条路中执行。如果你多弄几个线程的话,代码运行可能会更加“同步”。在一个有着多线程的典型进程中,零个或更多线程在同时运行。但是,在有着N个CPU的机器上,一个线程只能在给定的时间上在一个CPU上运行,因为每个线程都是一个代码段,每个CPU一次只能运行一段代码。而看起来像是N个同时完成是线程间共享CPU时间片的效果。这个例子里,我们将创建另一个线程,我们将用两个线程演示多线程的工作方式,最后,我们实现两个线程(主线程与新线程)同步,在新线程工作前必须等待消息。建立线程前我们必须引入System.Threading命名空间。然后我需要知道的是,线程得为控制流程建立一个起点。起点是一个函数,可以使一个相同的调用或其它。
这里你可以看到在同一个类中定义的起点函数。
using
System;
using
System.Threading;
namespace
ThreadingTester
{
class
ThreadClass
{
public
static
void
trmain()
{
for
(
int
x
=
0
;x
<
10
;x
++
)
{
Thread.Sleep(
1000
);
Console.WriteLine(x);
}
}
static
void
Main(
string
[] args)
{
Thread thrd1
=
new
Thread(
new
ThreadStart(trmain));
thrd1.Start();
for
(
int
x
=
0
;x
<
10
;x
++
)
{
Thread.Sleep(
900
);
Console.WriteLine(
"
Main :
"
+
x);
}
}
}
}
Thread.Sleep(n)方法把“this”线程置于n毫秒的休眠状态。你可以看看这个例子,在主函数我们定义了一个新的线程,其中它的起点是函数trmain(),我们然后包含了Start()方法开始执行。如果你运行这个例子,你就会了解线程间的切换(让CPU从运行一个线程转到另一个线程)让线程几乎同时运行,为了能看哪个线程运行更快我把主线程设置比新线程少100毫秒。
现在,在开始线程前,先给线程命名:
Thread thrd1=new Thread(new ThreadStart(trmain));
thrd1.Name="thread1";
thrd1.Start();
Thread tr = Thread.CurrentThread;
Console.WriteLine(tr.Name);
在完成上面程序后,设想我们不想在一开始新线程就让它马上运行结束,也就是说,我们开启了一个新线程,让它运行,在某个特定的时间点,新线程暂停并等待从主线程(或其他线程)发来的消息。
我们可以这样定义:
public static ManualResetEvent mre = new ManualResetEvent(false);
ManualResetEvent建立时是把false作为start的初始状态,这个类用于通知另一个线程,让它等待一个或多个线程。注意,为了通知或监听同一个线程,所有的其它线程都能访问那个类。
等待线程这样写:
mre.WaitOne();
这将引起等待线程无限期的阻塞并等待类来通知。
发信号的线程应该这样:
mre.Set();
这样类就会被通知,值变成true,等待线程就会停止等待。在通知事件发生后,我们就可以使用下面语句把线程置于基状态:
mre.Reset();
现在让我们在程序执行一下:
using
System;
using
System.Threading;
namespace
ThreadingTester
{
class
ThreadClass
{
public
static
ManualResetEvent mre
=
new
ManualResetEvent(
false
);
public
static
void
trmain()
{
Thread tr
=
Thread.CurrentThread;
Console.WriteLine(
"
thread: waiting for an event
"
);
mre.WaitOne();
Console.WriteLine(
"
thread: got an event
"
);
for
(
int
x
=
0
;x
<
10
;x
++
)
{
Thread.Sleep(
1000
);
Console.WriteLine(tr.Name
+
"
:
"
+
x);
}
}
static
void
Main(
string
[] args)
{
Thread thrd1
=
new
Thread(
new
ThreadStart(trmain));
thrd1.Name
=
"
thread1
"
;
thrd1.Start();
for
(
int
x
=
0
;x
<
10
;x
++
)
{
Thread.Sleep(
900
);
Console.WriteLine(
"
Main:
"
+
x);
if
(
5
==
x) mre.Set();
}
while
(thrd1.IsAlive)
{
Thread.Sleep(
1000
);
Console.WriteLine(
"
Main: waiting for thread to stop
"
);
}
}
}
}
posted on 2007-06-15 17:07
sopper
阅读(2023)
评论(9)
编辑
收藏
FeedBack:
#1楼
2007-06-16 00:02 |
agadsg [未注册用户]
顶了 !不错不错啊 !
相关内容来自:
http://www.lovewubi.cn/
相关内容来自:
http://www.shoushenmeirong.cn/
回复
引用
#2楼
2007-12-16 11:55 |
ProgramingFan [未注册用户]
嗯,不错,谢谢~
回复
引用
#3楼
2007-12-22 11:55 |
ggyy [未注册用户]
谢谢
回复
引用
#4楼
[
楼主
]
2007-12-22 12:45 |
sopper
不用谢
互想学习
回复
引用
查看
#5楼
2008-01-25 19:54 |
宋国彪 [未注册用户]
楼主写的 很详细,如不能理解,只能怪我自己水平太凹
回复
引用
#6楼
[
楼主
]
2008-01-26 10:05 |
sopper
@宋国彪
汗一个
这不是我的写的
一定要维护原创作者的版权
回复
引用
查看
#7楼
2008-04-25 14:19 |
何德勇 [未注册用户]
很好!谢谢
回复
引用
#8楼
2008-06-15 23:23 |
ken_sniper [未注册用户]
很不错的讲解,为什么当初大学里面的书上不这么写呢,呵呵.....
回复
引用
#9楼
2008-06-16 15:08 |
大师傅 [未注册用户]
看得爽,
回复
引用
社区
新闻
新用户注册
刷新评论列表
标题
姓名
主页
Email
(只有博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
最新IT新闻:
·
第一财经周刊:当前互联网世界正处无秩序时代
·
Visual Studio 2008 SDK 1.1 发布
·
死敌VMware变身微软认证计划新成员
·
英特尔雅虎开发网络计算机频道
·
Windows Live视频邮件9月9日开始测试
博客园新闻频道
博客园首页
社区