c#中的多线程

.NET的运行时环境的主 线程由Main ()方法来启动应用程序,而且.NET的编译语言有自动的垃圾收集功能,这个垃圾收集发生在另外一个线程里面,所有的这些都是后台发生的,让我们无法感觉 到发生了什么事情.在这里默认的是只有一个线程来完成所有的程序任务,但是正如我们在第一篇文章讨论过的一样,有可能我们根据需要自己添加更多的线程让程 序更好的协调工作。比如说我们的例子中,一个有用户输入的同时需要绘制图形或者完成大量的运算的程序,我们必须得增加一个线程,让用户的输入能够得到及时 的响应,因为输入对时间和响应的要求是紧迫的,而另外一个线程负责图形绘制或者大量的运算。

       下面是一个典型的多线程运用实例:

using System;

using System.Collections;

using System.Collections.Generic;

using System.Threading;

 

/// <summary>

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

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

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(this, new EventArgs());//引发完成事件

            }

            Monitor.Exit(this);//取消锁定

            Thread.Sleep(5);

        }

    }

 

    //执行完成之后,停止所有线程

    void ThreadDemo_OnNumberClear(object sender, EventArgs e)

    {

        Console.WriteLine("执行完了,停止了所有线程的执行。");

        threadTwo.Abort();

        threadOne.Abort();

        

    }

}

说明:要实现线程同步不止这一种方式。在这里采用了事件,在事件处理程序里中止了线程。

posted @ 2013-01-21 09:27  左手边的书  阅读(112)  评论(0编辑  收藏  举报