30, C#에서 여러 스레드 사용 방법

6057 단어
1. Thread
Thread는 기본적으로 프론트 데스크톱 라인을 시작합니다.다른 오픈 방식은 기본적으로 백엔드 라인을 시작합니다.
  • 우선 네임스페이스 가져오기: System.Threading
  • Thread 객체 인스턴스화
  • Thread newThread = new Thread(AMethod);
     // AMethod,           。
    
  • 부팅 스레드 실행 스레드를 시작하려면 Start
  • newThread.Start();
    
  • 정지 스레드
  • newThread.Abort();
    
    Thread 라인의 다양한 상용 방법 목록
    메서드
    조작하다
    Start
    스레드 실행 시작
    Sleep
    라인을 지정한 시간을 멈추게 합니다.
    Suspend
    라인이 안전점에 도착했을 때, 그것을 멈추게 해라.
    Abort
    라인이 안전점에 도착했을 때, 그것을 멈추게 해라.
    Resume
    마운트된 스레드 재부팅
    Join
    현재 라인을 다른 라인이 완성될 때까지 기다립니다.이 메서드는 시간 초과 값과 함께 사용할 때 지정된 시간 내에 스레드가 완료되면 True로 돌아갑니다.
    **안전점: **안전점은 코드에서 공용어가 실행될 때 자동으로'쓰레기 수거'를 안전하게 실행할 수 있는 위치를 가리킨다.쓰레기 수거는 더 이상 사용하지 않는 변수를 방출하고 메모리를 회수하는 과정을 말한다.스레드에 대한 Abort 또는 Suspend 메서드를 호출하면 공용 언어가 실행될 때 코드를 분석하여 스레드가 중단될 적절한 위치를 결정합니다.Thread의 관련 속성:
    등록 정보

    IsAlive
    스레드가 활성 상태이면 값 True가 포함됩니다.
    IsBackground
    블라인드 값을 가져오거나 설정합니다. 이 값은 라인이 맞는지, 백엔드 라인이 맞는지 여부를 나타냅니다.백엔드 라인은 백엔드 라인과 유사하지만, 백엔드 라인은 프로세스가 멈추는 것을 막지 않습니다.프로세스의 모든 프론트 데스크톱 스레드가 정지되면 공용 언어가 실행될 때 활성 상태인 백엔드 스레드에 Abort 방법을 호출하여 프로세스를 끝냅니다.
    Name
    라인의 이름을 가져오거나 설정합니다.보통 디버깅을 할 때 각 라인을 발견하는 데 사용됩니다.
    Priority
    라인 스케줄링의 우선순위를 정하는 데 사용할 운영체제의 값을 가져오거나 설정합니다.
    ApartmentState
    특정 라인에 사용할 라인 모형을 가져오거나 설정합니다.스레드 모델은 스레드가 비 트랜잭션 코드를 호출할 때 매우 중요하다.
    ThreadState
    스레드 상태를 설명하는 값을 포함합니다.
    스레드 우선 순위 각 스레드에는 실행에 사용되는 프로세서 타임 슬라이스 크기를 결정하는 우선 순위 속성이 있습니다.운영 체제는 높은 우선순위 라인에 비교적 긴 시간대를 분배하고 낮은 우선순위 라인에 비교적 짧은 시간대를 분배한다.새로 만든 스레드는 값Normal이 있지만 Priority 속성을 ThreadPriority 로 변경할 수 있습니다.
    2. 의뢰를 통해 스레드 오픈
    의뢰를 통해BeginInvoke 방법을 호출하여 하나의 라인을 열고 이 의뢰가 가리키는 방법을 집행한다.
    
            //        
            static string test1(int x, int y)
            {
                Console.WriteLine(x + y);
                return x + "+"+ y;
            }
    
            static void Main(string[] args)
            {
    
                Func fun1 = test1;
                //            。         ,             ,         ,     ,     。
                fun1.BeginInvoke(10, 20, test1CallBack, fun1);
                
            }
    
            //            ,                 
            static void test1CallBack(IAsyncResult ar)
            {
                //AsyncState         ,       fun1.BeginInvoke(10, 20, test1CallBack, fun1);      ,    fun1
                Func fun1 = ar.AsyncState as Func;
                //                。
                string result =  fun1.EndInvoke(ar);
                Console.WriteLine("     " + result);
            }
    

    3. 스레드 풀
           static void ThreadFunc3()
            {
                Console.WriteLine("--------");
                //           。      ,              。
                ThreadPool.QueueUserWorkItem(test3);
                ThreadPool.QueueUserWorkItem(test3);
                ThreadPool.QueueUserWorkItem(test3);
                ThreadPool.QueueUserWorkItem(test3);
                ThreadPool.QueueUserWorkItem(test3);
                ThreadPool.QueueUserWorkItem(test3);
                ThreadPool.QueueUserWorkItem(test3);
                ThreadPool.QueueUserWorkItem(test3);
                Console.WriteLine("========");
                Thread.Sleep(100);
            }
    
            //         ,    object       ,       
            static void test3(object obj)
            {
                Thread.CurrentThread.IsBackground = false;
                Console.WriteLine("asdas");
            }
    

    4. Task 오픈
            static void ThreadMethod()
            {
                Console.WriteLine("ThreadMethod Begin" + Thread.CurrentThread.ManagedThreadId);
                Thread.Sleep(1000);
                Console.WriteLine("Thread End");
            }
    
            static void continueTask(Task t)
            {
                Console.WriteLine("task is continue" + t.Id);
                Thread.Sleep(3000);
                Console.WriteLine("task is complete");
            }
    
            static void Main(string[] args)
            {
                //        
                //Task t = new  Task(ThreadMethod);
                //t.Start();
    
                ////        
                //TaskFactory tf = new TaskFactory();
                //tf.StartNew(ThreadMethod);
    
                Task t1 = new Task(ThreadMethod);  
                Task t2 = t1.ContinueWith(continueTask);
    
                t1.Start(); //      t1,  t1       ,   t2   
    
                Console.ReadKey();
            }
    

    5. 스레드 사용 문제
  • 자원 경쟁은 여러 라인이 같은 자원을 방문하고 같은 자원을 수정하면 데이터의 혼란을 초래할 수 있다.
  • 사라진 자물쇠는 여러 개의 자물쇠가 있다.서로 견제하다.라인이 서로 잠금 해제를 기다리게 만든다.
  • 사례:
  • 은행 입출금
  • 멀티 창구 동시 매표
  • using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Threading;
    
    namespace TestProject
    {
        class SaleTicket
        {
            private Thread thread1;
            private Thread thread2;
            private Thread thread3;
            private int ticketCount = 1000;
    
            public SaleTicket()
            {
                thread1 = new Thread(Sale);
                thread2 = new Thread(Sale);
                thread3 = new Thread(Sale);
            }
    
            public void Sale()
            {
                while(true)
                {
                    lock(this)
                    {
                        if (ticketCount > 0)
                        {
                            ticketCount -= 1;
                            Console.WriteLine(Thread.CurrentThread.Name + "     ,  " + ticketCount);
                        }
                        else
                        {
                            Console.WriteLine(Thread.CurrentThread.Name + ":    ");
                            break;
                        }
                    }
                }
            }
    
            public void StartSaleTicket()
            {
                thread1.Start();
                thread2.Start();
                thread3.Start();
            }
        }
    }
    

    좋은 웹페이지 즐겨찾기