Cshap多线程编程简单实例

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 threadOne;
     private Thread threadTwo;
     private ArrayList stringList;
     private  event EventHandler OnNumberClear; // 数据删除完成引发的事件
     public  static  void Main()
    {
        ThreadDemo demo =  new ThreadDemo(1000);
        demo.Action();
    }
     public ThreadDemo( int number)
    {
        Random random =  new Random(1000000);
        stringList =  new ArrayList(number);
         for ( int i = 0; i < number; i++)
        {
            stringList.Add(random.Next().ToString());
        }
        threadOne =  new Thread( new ThreadStart(Run)); // 两个线程共同做一件事情
        threadTwo =  new Thread( new ThreadStart(Run)); // 两个线程共同做一件事情
        threadOne.Name = "线程1";
        threadTwo.Name = "线程2";
        OnNumberClear +=  new EventHandler(ThreadDemo_OnNumberClear);
        
    }
     ///   <summary>
    
///  开始工作
    
///   </summary>
     public  void Action()
    {
        threadOne.Start();
        threadTwo.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( thisnew EventArgs()); // 引发完成事件
            }
            Monitor.Exit( this); // 取消锁定
            Thread.Sleep(5);
        }
    }

     // 执行完成之后,停止所有线程
     void ThreadDemo_OnNumberClear( object sender, EventArgs e)
    {
        Console.WriteLine("执行完了,停止了所有线程的执行。");
        threadTwo.Abort();
        threadOne.Abort();
        
    }
}
 
 
说明:要实现线程同步不止这一种方式。在这里采用了事件,在事件处理程序里中止了线程(主要是回答csdn论坛的一个朋友的问题才用了这种办法)。
建了一个QQ技术交流群 C#、.Net技术交流群 242497960  欢迎大家加入点击链接加入群【C#、.Net技术交流群】: http://jq.qq.com/?_wv=1027&k=ON45Ii
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多个C#多线程开发实例 using System; using System.Collections.Generic; using System.Text; namespace Example20 { class Program { class Class1 : IDisposable { //析构函数,编译后变成 protected void Finalize(),GC会在回收对象前会调用调用该方法 ~Class1() { Dispose(false); } //通过实现该接口,客户可以显式地释放对象,而不需要等待GC来释放资源,据说那样会降低效率 void IDisposable.Dispose() { Dispose(true); } //将释放非托管资源设计成一个虚函数,提供在继承类中释放基类的资源的能力 protected virtual void ReleaseUnmanageResources() { //Do something... } //私有函数用以释放非托管资源 private void Dispose(bool disposing) { ReleaseUnmanageResources(); //为true时表示是客户显式调用了释放函数,需通知GC不要再调用对象的Finalize方法 //为false时肯定是GC调用了对象的Finalize方法,所以没有必要再告诉GC你不要调用我的Finalize方法啦 if (disposing) { GC.SuppressFinalize(this); } } } static void Main(string[] args) { //tmpObj1没有手工释放资源,就等着GC来慢慢的释放它吧 Class1 tmpObj1 = new Class1(); //tmpObj2调用了Dispose方法,传说比等着GC来释放它效率要调一些 //个人认为是因为要逐个对象的查看其元数据,以确认是否实现了Dispose方法吧 //当然最重要的是我们可以自己确定释放的时间以节省内存,优化程序运行效率 Class1 tmpObj2 = new Class1(); ((IDisposable)tmpObj2).Dispose(); } } }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值