您的位置:首页 > 职场人生

黑马程序员-.net下多线程的实现

2012-02-01 10:46 183 查看
---------------------- Windows Phone 7手机开发.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(<Time in Second>);

  ·中止线程:

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

  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 ", DummyThread.Name);

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

  DummyPriorityThread.IsBackground=true;

  DummyPriorityThread.Name = "Second Thread";

  DummyPriorityThread.Start( );

  Console.WriteLine("Started thread ", 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 . SomeFunction: "+Thread.CurrentThread.Name+counter);

  }

  }

  catch (ThreadInterruptedException Ex)

  {

  Console.WriteLine( "Exception in thread "+Thread.CurrentThread.Name);

  }

  finally

  {

  Console.WriteLine( "Thread Exiting. "+Thread.CurrentThread.Name);

  }

  }

  }

  }

  ·使用Interlock

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

  Interlocked.SomeFunction (ref counter);

  ·使用锁

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

  lock (this){ Some statements ;}

  ·使用Monitor

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

  Monitor.Enter(this);

  其他也有一些方法进行管理,这里就不一一提及了。

  线程的缺点

  线程自然也有缺点,以下列出了一些:

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

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

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

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

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

---------------------- Windows Phone 7手机开发.Net培训、期待与您交流! ----------------------详细请查看:http://net.itheima.com/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐