- 1、本文档共55页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C多线程学习手册
C#中的线程文章系参考转载,英文原文网址请参考:/threading/
Joseph Albahari,? 翻译:?Swanky Wu
要点:
入门
概述与概念
创建和开始使用多线程
线程同步基础
同步要领
锁和线程安全
Interrupt 和 Abort
线程状态
等待句柄
同步环境
使用多线程
单元模式和Windows Forms
BackgroundWorker类
ReaderWriterLock类
线程池
异步委托
计时器
局部储存
高级话题
非阻止同步
Wait和Pulse
Suspend和Resume
终止线程
一、入门
1.? 概述与概念
?C#支持通过多线程并行地执行代码,一个线程有它独立的执行路径,能够与其它的线程同时地运行。一个C#程序开始于一个单线程,这个单线程是被CLR和操作系统(也称为“主线程”)自动创建的,并具有多线程创建额外的线程。这里的一个简单的例子及其输出:
???????
using System;
using System.Threading; ?
class?ThreadTest
{
?? static?void?Main()
{
???? Thread t = new?Thread (WriteY);
??? ?t.Start();????????????????????????? // Run WriteY on the new thread
?? ??while?(true)
Console.Write (x);?? // Write x forever
?? }
??static?void?WriteY()
{
??? ?while?(true)
Console.Write (y);?? // Write y forever
?? }
}
?主线程创建了一个新线程“t”,它运行了一个重复打印字母y的方法,同时主线程重复但因字母“x”。CLR分配每个线程到它自己的内存堆栈上,来保证局部变量的分离运行。在接下来的方法中我们定义了一个局部变量,然后在主线程和新创建的线程上同时地调用这个方法。
static?void?Main() {
??new?Thread (Go).Start();????? // Call Go() on a new thread
? ?Go();???????????????????????? // Call Go() on the main thread
}
??
static?void?Go()
{
?? // Declare and use a local variable - cycles
?? for?(int?cycles = 0; cycles 5; cycles++)
Console.Write (?);
} 变量cycles的副本分别在各自的内存堆栈中创建,输出也一样,可预见,会有10个问号输出。当线程们引用了一些公用的目标实例的时候,他们会共享数据。下面是实例:
class?ThreadTest {
? bool?done;
?? ?static?void?Main()
{
?? ?ThreadTest tt = new?ThreadTest();?? // Create a common instance
??? new?Thread (tt.Go).Start();
? ??tt.Go();
?}
??
?// Note that Go is now an instance method
?void?Go()
{
?? ?if?(!done)
{
done = true;
Console.WriteLine (Done);
}
?}
} ?因为在相同的bThreadTest/b实例中,两个线程都调用了bGo()/b,它们共享了bdone/b字段,这个结果输出的是一个Done,而不是两个。
?静态字段提供了另一种在线程间共享数据的方式,下面是一个以done为静态字段的例子:
class?ThreadTest {
?static?bool?done;??? // Static fields are shared between all threads
? static?void?Main()
{
? ??new?Thread (Go).Start();
??? Go();
? }
??
? static?void?Go()
{
? ??if?(!done)
{
done = true;
Console.WriteLi
文档评论(0)