.NET线程控制

线程:

操作系统使用进程将正在执行的不同应用程序分开。线程是操作系统分配处理器时间的基本单元,并且该进程中可以有多个线程同时执行代码。每个线程都维护异常处理程序、调度优先级和一组系统用于在调度该线程前保存线程上下文的结构。线程上下文包括使线程在线程的宿主进程地址空间中无缝地继续执行所需要的所有信息,包括线程的CPU寄存器组合和堆栈。

1)创建线程,使用System.Threading下的Thread类:

Thread thread=new Thread(new ThreadStart(FunctionName));

//线程处理函数

Private void FunctionName()

{}

2)线程启动,使用Thread类的Start方法(方法无参数也无返回值):

//FunctionName为线程处理函数

Thread thread=new Thread(news ThreadStart(FunctionName));

//启动线程

thread.Start();

3)线程暂停与重新启动

线程重新启动后,可以调用Thread.Sleep使当前线程立即阻塞一段时间(参数单位为毫秒),调用Thread.Sleep(Timeout.Infinite)将使线程休眠,直到它被另一个进程调用Thread.Interrupt中断或被Thread.Abort中止为止。注意,一个线程不能对另一个线程调用Sleep.

eg:Thread.Sleep(2000);//使当前线程阻塞2秒

可以通过调用Thread.Suspend来暂停一个线程。当线程自己调用Thread.Suspend时,该调用将阻塞,直到该线程被另一个线程继续为止。当一个线程对另一个线程调用Thread.Suspend时,该调用就成为使另一个线程暂停的非阻塞调用(把一个线程阻塞,自己运行)。

eg:Thread thread=new Thread(new ThreadStart(FunctionName));

thread.Start();

...

thread.Suspend();//自调用阻塞

调用Thread.Resume将一个线程跳出挂起状态并使该进程继续执行,而与调用Thread.Suspend的次数无关。

eg:Thread thread=new Thread(new ThreadStart(FunctionName));

...

thread.Suspend();

thread.Suspend();

//调用Thread.Suspend的2次,但只要调用thread.Resume()线程就继续执行

...

thread.Resume();

通过调用Thread.Join将本线程阻塞直至另一线程终止时再执行)。

eg:Thread thread=new Thread(new ThreadStart(FunctionName));

thread.Start();

...

thread.Join(1000);

经典例子:

        static void Main()

        {

            System.Threading.Thread x = new System.Threading.Thread(new System.Threading.ThreadStart(f1));

            x.Start();

            Console.WriteLine("This is Main.{0}", 1);

            x.Join();//停止前执行线程处理函数f1

            Console.WriteLine("This is Main.{0}", 2);

            Console.ReadLine();

        }

        static void f1()

        {

            System.Threading.Thread y = new System.Threading.Thread(new System.Threading.ThreadStart(f2));

            y.Start();

            y.Join();

            Console.WriteLine("This is F1.{0}",1);

        }

 

        static void f2()

        {

            Console.WriteLine("This is F2.{0}", 1);

        }

输出:

This is Main.1

This is F2.1

This is F1.1

This is Main.2

 

如果: 注释//  x.Join();

结果:

This is Main.1

This is Main.2

This is F2.1

This is F1.1

 

4)线程销毁

线程占用大量的系统资源,使用完后必须使用Thread.Abort和Thread.Interrupt方法销毁。

在主线程调用子线程的Thread.Abort后,会在子线程中抛出一个ThreadAbortException异常,可以在子线程中使用try...catch捕获该异常,并进行相应的处理。但,如果在调用Thread.Abort之前,子线程已经结束,则不出现异常。反之,子线程还未结束则出现异常。

线程不一定会立即中止,或者根本不中止。如果线程在作为中止过程的一部分被调用的 finally 块中做非常大量的计算,从而无限期延迟中止操作,则会发生这种情况。若要在线程中止之前一直等待,可以在调用 Abort 方法后对该线程调用 Join 方法,但是不能保证等待会结束。

如果对尚未启动的线程调用 Abort,则当调用 Start 时该线程将中止,抛出异常提示“线程正在运行或被终止;它无法重新启动。”。如果对被阻止或正在休眠的线程调用 Abort,则该线程被中断然后中止。

如果在已挂起的线程上调用 Abort,则将在调用 Abort 的线程中引发 ThreadStateException,并将 AbortRequested 添加到被中止的线程的 ThreadState 属性中。直到调用 Resume 后,才在挂起的线程中引发 ThreadAbortException。

如果在执行非托管代码时线程忽略 ThreadAbortException,则当线程开始执行托管代码时,系统将再次引发 ThreadAbortException。

如果同时出现两次对 Abort 的调用,则可能一个调用设置状态信息,而另一个调用执行 Abort。但是,应用程序无法区分这一点。

对线程调用了 Abort 后,线程状态包括 AbortRequested。成功调用 Abort 而使线程终止后,线程状态更改为 Stopped。如果有足够的权限,作为 Abort 目标的线程就可以使用 ResetAbort 方法取消中止操作。有关说明如何调用 ResetAbort 方法的示例,请参见 ThreadAbortException 类。

Thread.Interrupt方法用于中断处于Wait、Sleep、Join线程状态的线程。如果线程当前未阻塞,在等待、休眠或连接状态中,则下次开始阻塞时它将被中断。

eg:Thread thread=new Thread(new ThreadStart(FunctionName));

thread.Start();

...

thread.Join(10000);

thread.Interrupt();

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本书介绍如何利用.NET Framework所提供的线程功能,并引导您学习线程所提供的各种特性,而且还将为您指出如何在使用经程的过程中避免可能遇到的陷阱。.NET Framework提供的是一种完全不同的线程模型,即自由线程,如果只熟悉VB 6的单元模型的话,则可能会利用到一些已经习惯的东西。 内容提要 .NET Framework为VB程序员提供了强大的线程模型,可以让程序员很好地控制应用程序中的线程。 本书介绍了如何利用.NET线程功能创建和操作线程,如何设计应用程序,如何防范常见的错误,如何避免应用程序失去控制等内容。全书共分7章,分别讲述了线程的定义、线程的创建、线程的同步、设计模式、线程应用程序的伸缩、线程的调试和跟踪等内容。 本书适合于从事.NET开发的VB程序员阅读,不要求读者具备任何线程方面的知识。 目录 第1章 定义线程 1.1 线程的定义 1.1.1 多任务 1.1.2 进程 1.1.3 线程 1.2 Visual Basic.NET线程的支持 1.2.1 System.AppDomain类 1.2.2 线程管理与.NET运行库 1.3 本章小结第2章 .NET中的线程 2.1 System.Threading命名空间 2.1.1 Thread类 2.1.2 创建一个线程 2.1.3 ThreadStart委托和执行分支 2.1.4 线程的属性和方法 2.1.5 线程的优先级 2.1.6 计时器和回调 2.1.7 使用线程调节线程 2.2 线程的生存期 2.2.1 使线程睡眠 2.2.2 中断一个线程 2.2.3 暂停及恢复线程 2.2.4 破坏线程 2.2.5 连接线程 2.3 为什么线程不是万能的 2.4 使用线程提供的机会 2.4.1 后台进程 2.4.2 访问外部资源 2.5 线程的陷阱 2.5.1 再次访问的执行顺序 2.5.2 一个循环中的线程 2.6 本章小结第3章 使用线程 3.1 为何担心同步 3.1.1 同步临界区 3.1.2 使账户对象不可改变 3.1.3 使用线程安全包装器 3.2 .NET对同步的支持 3.3 .NET同步策略 3.3.1 同步上下文 3.3.2 同步代码区 3.3.3 手控同步 3.3.4 同步和性能 3.4 小心死锁 3.5 端到端的示例 3.5.1 编写自己的线程安全包装器 3.5.2 据库连接池 3.6 本章小结第4章 设计模式 4.1 应用程序中的多线程 4.2 STA线程模式 4.3 MTA线程模式 4.3.1 指定线程模式 4.3.2 设计线程应用程序 4.3.3 线程和关系 4.4 本章小结第5章 线程应用程序的伸缩 5.1 什么是线程池管理 5.1.1 需要线程池的情况 5.1.2 线程地的概念 5.2 CLR和线程 5.2.1 CLR在线程地管理中的角色 5.2.2 线程地管理中的问题 5.2.3 线程地的大小 5.3 ThreadPool类 5.4 VB.NET中的线程池编程 5.5 .NET中的可伸缩性 5.6 本章小结第6章 调试与跟踪线程 6.1 创建应用程序代码 6.2 调试代码 6.2.1 Visual Studio.NET调试器 6.2.2 逐步执行代码 6.2.3 设置断点 6.2.4 调试线程 6.3 代码跟踪 6.3.1 System.Diagnostics.Trace类 6.3.2 使用不同的侦听器应用程序 6.3.3 跟踪开关 6.3.4 Debug类 6.4 DataImport示例 6.4.1 代码 6.4.2 测试应用程序 6.4.3 逻辑错误 6.5 本章小结第7章 联网与线程 7.1 在.NET中的联网 7.1.1 System.Net命名空间 7.1.2 System.Net.Sockets命名空间 7.2 创建范例应用程序 7.2.1 设计目标 7.2.2 构建应用程序 7.2.3 运行应用程序 7.3 本章小结附录 作者介绍

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值