`
lovnet
  • 浏览: 6710152 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

学习笔记5(浅谈.net中的多线程)

 
阅读更多

什么是线程

每个正在系统上运行的程序都是一个进程,每个进程包含一到多个线程,进程也可能是整个程序或者是部分程序的动态执行,线程是一组指令的集合,或者是程序的特殊段,它可以在整个程序里独立执行,也可以把它理解为代码运行的上下文,所以线程基本上是轻量级的进程,它负责在单元程序里执行多任务,通常有操作系统负责多个线程的调度和执行。

什么是多线程

多线程是为了使得多个线程并行的工作以完成多项任务,以提高系统的效率,线程是在同一时间需要完成多项任务的时候被实现的。

使用线程的好处

使用线程可以把占据长时间的程序中的任务放到后台去处理

用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度

程序的运行速度可能加快

在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了,在这种情况下我们可以释放一些珍贵的资源如内存占用等等

多线程在.NET里如何工作?

在本质上和结构来说,.NET是一个多线程的环境。有两种主要的多线程方法是.NET所提倡的:使用ThreadStart来开始你自己的进程,直接的(使用ThreadPool.QueueUserWorkItem)或者间接的(比如Stream.BeginRead,或者调用BeginInvoke)使用ThreadPool类。一般来说,你可以"手动"为长时间运行的任务创建一个新的线程,另外对于短时间运行的任务尤其是经常需要开始的那些,进程池是一个非常好的选择。进程池可以同时运行多个任务,还可以使用框架类。对于资源紧缺需要进行同步的情况来说,它可以限制某一时刻只允许一个线程访问资源。这种情况可以视为给线程实现了锁机制。线程的基类是System.Threading。所有线程通过CLI来进行管理。

创建线程:

创建一个新的Thread对象的实例。Thread的构造函数接受一个参数:

Thread DummyThread = new Thread( new ThreadStart(dummyFunction) );

执行线程:

使用Threading命名空间里的start方法来运行线程:

DummyThread.Start ();

组合线程:

经常会出现需要组合多个线程的情况,就是当某个线程需要其他线程的结束来完成自己的任务。假设DummyThread必须等待DummyPriorityThread来完成自己的任务,我们只需要这样做:

DummyPriorityThread.Join() ;

暂停线程:

使得线程暂停给定的秒

DummyPriorityThread.Sleep();

中止线程:

如果需要中止线程可以使用如下的代码:

DummyPriorityThread.Abort();

同步

经常我们会遇到需要在线程间进行同步的情况,下面的代码给出了一些方法:

using System;using System.Threading;namespace SynchronizationThreadsExample{

 class SynchronizationThreadsExample{

  private int counter = 0;

  static void Main( ) {

   SynchronizationThreadsExample STE = new SynchronizationThreadsExample();

   STE.ThreadFunction( );

  }

  public void ThreadFunction ( ) {

   Thread DummyThread = new Thread( new ThreadStart(SomeFunction) ;

   DummyThread.IsBackground=true;

   DummyThread.Name = "First Thread";

   DummyThread.Start( );

   Console.WriteLine("Started thread {0}", DummyThread.Name);

   Thread DummyPriorityThread = new Thread( new ThreadStart(SomeFunction) );

   DummyPriorityThread.IsBackground=true;

   DummyPriorityThread.Name = "Second Thread";

   DummyPriorityThread.Start( );

   Console.WriteLine("Started thread {0}", DummyPriorityThread.Name);

   DummyThread.Join( );

   DummyPriorityThread.Join( );

  }

  public void SomeFunction( ) {

   try {

    while (counter < 10) {

     int tempCounter = counter;

     tempCounter ++;

     Thread.Sleep(1);

     counter = tempCounter;

     Console.WriteLine( "Thread {0}. SomeFunction: {1}",Thread.CurrentThread.Name, counter);

    }

   }

   catch (ThreadInterruptedException Ex) {

    Console.WriteLine( "Exception in thread {0} ", Thread.CurrentThread.Name);

   }

   finally {

    Console.WriteLine( "Thread {0} Exiting. ",Thread.CurrentThread.Name);

   }

  }

 }

}

使用Interlock

C#提供了一个特殊的类叫做interlocked,就是提供了锁机制的实现,我们可以加入如下的代码实现锁机制:

Interlocked.SomeFunction (ref counter);

使用锁

这是为了锁定代码关键区域以进行同步,锁定代码如下:

lock (this){ Some statements ;}

使用Monitor

当有需要进行线程管理的时候我们可以使用:

Monitor.Enter(this);

线程的缺点

如果有大量的线程,会影响性能,因为操作系统需要在它们之间切换

更多的线程需要更多的内存空间

线程会给程序带来更多的bug,因此要小心使用

线程的中止需要考虑其对程序运行的影响

通常块模型数据是在多个线程间共享的,需要一个合适的锁系统替换掉数据共享

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics