zoukankan      html  css  js  c++  java
  • 一个简单的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(
    thisnew 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

  • 相关阅读:
    PythonのTkinter基本原理
    使用 Word (VBA) 分割长图到多页
    如何使用 Shebang Line (Python 虚拟环境)
    将常用的 VBScript 脚本放到任务栏 (Pin VBScript to Taskbar)
    关于 VBScript 中的 CreateObject
    Windows Scripting Host (WSH) 是什么?
    Component Object Model (COM) 是什么?
    IOS 打开中文 html 文件,显示乱码的问题
    科技发展时间线(Technology Timeline)
    列置换密码
  • 原文地址:https://www.cnblogs.com/sandy_liao/p/1891533.html
Copyright © 2011-2022 走看看