一个简单的C#多线程间同步的例子 from 小菜鸟之家~ASP.NET 入门中

在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。

这个程序的思路是共同做一件事情(从一个ArrayList中删除元素),如果执行完成了,两个线程都停止执行。

代码如下:

using  System;
using  System.Collections;
using  System.Collections.Generic;
using  System.Threading;

///  <summary>
///  在开发中经常会遇到线程的例子,如果某个后台操作比较费时间,我们就可以启动一个线程去执行那个费时的操作,同时程序继续执行。在某些情况下可能会出现多个线程的同步协同的问题,下面的例子就展示了在两个线程之间如何协同工作。
///
/// 这个程序的思路是共同做一件事情(从一个ArrayList中删除元素),如果执行完成了,两个线程都停止执行。
/// 作者:周公
///  时间:2008-5-17
///  原发地址: http://blog.csdn.net/zhoufoxcn
///  </summary>
public  class  ThreadDemo
{
    
private  Thread[] threads;
    
private  int  thrs  =  5 ;
    
private  ArrayList stringList;
    
private  event  EventHandler OnNumberClear; // 数据删除完成引发的事件
     public  static  void  Main()
    {
        ThreadDemo demo 
=  new  ThreadDemo( 100 );
        demo.Action();
    }
    
public  ThreadDemo( int  number)
    {
        Random random 
=  new  Random( 1000000 );
        stringList 
=  new  ArrayList(number);
        
for  ( int  i  =  0 ; i  <  number; i ++ )
        {
            stringList.Add(i.ToString());
        }
        threads 
=  new  Thread[thrs];
        
for  ( int  i  =  0 ; i  <  thrs; i ++ )
        {
            threads[i] 
=  new  Thread( new  ThreadStart(Run));
            threads[i].Name 
=  " 线程 "  +  (i  +  1 );
        }
        OnNumberClear 
+=  new  EventHandler(ThreadDemo_OnNumberClear);

    }
    
///  <summary>
    
///  开始工作
    
///  </summary>
     public  void  Action()
    {
        
for  ( int  i  =  0 ; i  <  thrs; i ++ )
        {
            threads[i].Start();
        }
    }
    
///  <summary>
    
///  共同做的工作
    
///  </summary>
     private  void  Run()
    {
        
string  stringValue  =  null ;
        
while  ( true )
        {
            Monitor.Enter(
this ); // 锁定,保持同步
            stringValue  =  ( string )stringList[ 0 ];
            Console.WriteLine(Thread.CurrentThread.Name 
+  " 删除了 "  +  stringValue);
            stringList.RemoveAt(
0 ); // 删除ArrayList中的元素
             if  (stringList.Count  ==  0 )
            {
                OnNumberClear(
this new  EventArgs()); // 引发完成事件
            }
            Monitor.Exit(
this ); // 取消锁定
            Thread.Sleep( 5 );
        }
    }

    
// 执行完成之后,停止所有线程
     void  ThreadDemo_OnNumberClear( object  sender, EventArgs e)
    {
        Console.WriteLine(
" 执行完了,停止了所有线程的执行。 " );
        
for  ( int  i  =  0 ; i  <  thrs; i ++ )
        {
            threads[i].Abort();
        }
    }
}

 

 

reference : http://www.cnblogs.com/0754ydj/archive/2009/03/04/1403130.html

 

 

 

 

 

 

转载于:https://www.cnblogs.com/sandy_liao/archive/2010/11/29/1891533.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值