c#다중 스레드 소스 3

2368 단어
개발 과정에서 자주 라인의 예를 볼 수 있다. 만약에 어떤 백엔드 조작이 비교적 시간이 걸린다면 우리는 한 라인을 시작해서 그 시간이 걸리는 조작을 실행하고 프로그램을 계속 실행할 수 있다.어떤 상황에서 여러 개의 라인이 동시 협동하는 문제가 발생할 수 있다. 아래의 예는 두 라인 사이에서 어떻게 협동하여 일을 하는지 보여준다.
이 프로그램의 사고방식은 하나의 일을 공동으로 하는 것이다. (하나의 Array List에서 요소를 삭제하는 것) 실행이 완료되면 두 라인이 모두 실행을 멈추는 것이다.설명: 라인 동기화를 실현하는 것은 이 방식이 아니다.여기에 이벤트를 사용했습니다. 이벤트 처리 프로그램에서 라인을 중단했습니다.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
using System.Threading;

namespace ConsoleApplication1
{
    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);
	 
	    }
	    ///
	    ///     
	    ///
	    public void Action()
	    {
	        threadOne.Start();
	        threadTwo.Start();
	    }
	    ///
	    ///       
	    ///
	    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();
	    }
	}
}

좋은 웹페이지 즐겨찾기