C# 스레드의 일시 중지 및 일시 중지 해제

10016 단어 c#라인
만약 C#과 C++가 어떤 차이가 있다면, 블로거는 비동기적인 지지 정도가 C#의 하나하나의 위대한 진보라고 말할 수 밖에 없다.
사실 초기의 C++는 모두 비동기적이고 병행적인 개념이 없었다.블로거가 처음으로 C++를 사용하여 비동기 프로그램을 만들었을 때 boost 라이브러리의 내용을 사용하여 이루어졌습니다.상대적으로 C#은 비동기적인 지원에 상당히 좋다고 할 수 있다.많은 명사들을 믿습니다. 예를 들면 Thread, Begin Invoke, Delegate, backgroundworker 등등...사실 건물주는 이렇게 많은 비동기적인 조작을 사용하는 과정에서backgroudworker가 비교적 좋다고 생각한다.
물론, 우리가 오늘 말하고자 하는 것은 위의 것과 무관하다.라인에서 깨우기 동작을 어떻게 하는지 설명합니다.
가령 Thread가 지금 끊어져서 적당한 때에 깨워야 한다면 이 라인(소비자 모드)을 깨워야 한다.만약 여러분이 Suspend, Resume로 조작해야 한다면, 나는 그래도 재삼 생각해야 한다고 건의합니다.다음은 msdn 원어(https://msdn.microsoft.com/zh-cn/library/system.threading.thread.suspend(v=vs.110).aspx입니다.
    Do not use the Suspend and Resume methods to synchronize the activities of threads. You have no way of knowing what code a thread is executing when you suspend it. If you suspend a thread while it holds locks during a security permission evaluation, other threads in the AppDomain might be blocked. If you suspend a thread while it is executing a class constructor, other threads in the AppDomain that attempt to use that class are blocked. Deadlocks can occur very easily.
이 글에서 말하고자 하는 라인을 끊고 계속하는 방식은 사실 AutoReset Event와 Manual Reset Event의 방법을 이용하여 막고 계속하는 것이다.
AutoReset Event와 ManualReset Event를 소개하기 전에 먼저 하나의 개념을 소개합니다. 바로 스레드에서 Set () 와 Reset () 의 차이점입니다.
  • set: 하나의 사건을 신호로 설정하면 이 사건에 막힌 라인이 계속될 수 있다는 것을 가리킨다.
  • reset: 하나의 사건을 무신호로 설정하면 계속 시도하는 사건이 막히는 것을 가리킨다.
  • 1, AutoResetEvent 클래스


    이 종류의 글자 뜻은 모든 것을 설명할 수 있다. 자동reset 이벤트는 이 이벤트가 set 이후에 어떤 라인이 막히고 계속되면 자동reset이다.다음에 계속 시도하면 여전히 막힐 것이다.
    여기서 AutoResetEvent 클래스의 구조 함수는bool형이다.
    MSDN의 설명은 다음과 같습니다.
          Initializes a new instance of the AutoResetEvent class with a Boolean value indicating whether to set the initial state to signaled.
    만약 이 매개 변수가true라면, 첫 번째 시도가 계속되면 막히지 않을 것이다.만약 이 매개 변수가false라면, 첫 번째 시도는 계속 막힐 것이다.
    다음은 MSDN에서 가져온 테스트 코드입니다.
    
    using System;
    using System.Threading;
    
    // Visual Studio: Replace the default class in a Console project with 
    //                the following class.
    class Example
    {
        private static AutoResetEvent event_1 = new AutoResetEvent(true);
        private static AutoResetEvent event_2 = new AutoResetEvent(false);
    
        static void Main()
        {
            Console.WriteLine("Press Enter to create three threads and start them.\r
    " + "The threads wait on AutoResetEvent #1, which was created\r
    " + "in the signaled state, so the first thread is released.\r
    " + "This puts AutoResetEvent #1 into the unsignaled state."); Console.ReadLine(); for (int i = 1; i < 4; i++) { Thread t = new Thread(ThreadProc); t.Name = "Thread_" + i; t.Start(); } Thread.Sleep(250); for (int i = 0; i < 2; i++) { Console.WriteLine("Press Enter to release another thread."); Console.ReadLine(); event_1.Set(); Thread.Sleep(250); } Console.WriteLine("\r
    All threads are now waiting on AutoResetEvent #2."); for (int i = 0; i < 3; i++) { Console.WriteLine("Press Enter to release a thread."); Console.ReadLine(); event_2.Set(); Thread.Sleep(250); } // Visual Studio: Uncomment the following line. //Console.Readline(); } static void ThreadProc() { string name = Thread.CurrentThread.Name; Console.WriteLine("{0} waits on AutoResetEvent #1.", name); event_1.WaitOne(); Console.WriteLine("{0} is released from AutoResetEvent #1.", name); Console.WriteLine("{0} waits on AutoResetEvent #2.", name); event_2.WaitOne(); Console.WriteLine("{0} is released from AutoResetEvent #2.", name); Console.WriteLine("{0} ends.", name); } }
    여기서 AutoResetEvent.WaitOne() 이 방법은 스레드에서 계속 시도하는 것입니다.SET 신호가 없으면 계속 막히고, Set 신호를 받으면 이 라인이 계속된다.하지만 AutoReset Event이기 때문에 다음 waitOne은 여전히 막힐 것입니다.
    위 코드의 출력 결과는 다음과 같습니다.
    
    Press Enter to create three threads and start them.
    The threads wait on AutoResetEvent #1, which was created
    in the signaled state, so the first thread is released.
    This puts AutoResetEvent #1 into the unsignaled state.
    
    Thread_1 waits on AutoResetEvent #1.
    Thread_1 is released from AutoResetEvent #1.
    Thread_1 waits on AutoResetEvent #2.
    Thread_3 waits on AutoResetEvent #1.
    Thread_2 waits on AutoResetEvent #1.
    Press Enter to release another thread.
    
    Thread_3 is released from AutoResetEvent #1.
    Thread_3 waits on AutoResetEvent #2.
    Press Enter to release another thread.
    
    Thread_2 is released from AutoResetEvent #1.
    Thread_2 waits on AutoResetEvent #2.
    
    All threads are now waiting on AutoResetEvent #2.
    Press Enter to release a thread.
    
    Thread_2 is released from AutoResetEvent #2.
    Thread_2 ends.
    Press Enter to release a thread.
    
    Thread_1 is released from AutoResetEvent #2.
    Thread_1 ends.
    Press Enter to release a thread.
    
    Thread_3 is released from AutoResetEvent #2.
    Thread_3 ends.

    둘째, ManualResetEvent


    Manual Reset Event와 Auto Reset Event는 대부분 개념이 같고 가장 큰 차이점은 자동 reset이고 하나는 수동 reset이다.즉, ManualReset Event 클래스를 사용하면 설정된 후에 막힌 모든 스레드(waitone () 가 계속됩니다.그리고 수동으로 다시 셋업하지 않으면waitone를 호출하는 라인도 막히지 않습니다.즉, 이 종류는 수동으로 폐쇄 신호를 켜는 사건이다.
    다음은 MSDN에서 가져온 테스트 코드입니다.
    
    using System;
    using System.Threading;
    
    public class Example
    {
        // mre is used to block and release threads manually. It is
        // created in the unsignaled state.
        private static ManualResetEvent mre = new ManualResetEvent(false);
    
        static void Main()
        {
            Console.WriteLine("
    Start 3 named threads that block on a ManualResetEvent:
    "); for(int i = 0; i <= 2; i++) { Thread t = new Thread(ThreadProc); t.Name = "Thread_" + i; t.Start(); } Thread.Sleep(500); Console.WriteLine("
    When all three threads have started, press Enter to call Set()" + "
    to release all the threads.
    "); Console.ReadLine(); mre.Set(); Thread.Sleep(500); Console.WriteLine("
    When a ManualResetEvent is signaled, threads that call WaitOne()" + "
    do not block. Press Enter to show this.
    "); Console.ReadLine(); for(int i = 3; i <= 4; i++) { Thread t = new Thread(ThreadProc); t.Name = "Thread_" + i; t.Start(); } Thread.Sleep(500); Console.WriteLine("
    Press Enter to call Reset(), so that threads once again block" + "
    when they call WaitOne().
    "); Console.ReadLine(); mre.Reset(); // Start a thread that waits on the ManualResetEvent. Thread t5 = new Thread(ThreadProc); t5.Name = "Thread_5"; t5.Start(); Thread.Sleep(500); Console.WriteLine("
    Press Enter to call Set() and conclude the demo."); Console.ReadLine(); mre.Set(); // If you run this example in Visual Studio, uncomment the following line: //Console.ReadLine(); } private static void ThreadProc() { string name = Thread.CurrentThread.Name; Console.WriteLine(name + " starts and calls mre.WaitOne()"); mre.WaitOne(); Console.WriteLine(name + " ends."); } }
    출력 결과:
    
    Start 3 named threads that block on a ManualResetEvent:
    
    Thread_0 starts and calls mre.WaitOne()
    Thread_1 starts and calls mre.WaitOne()
    Thread_2 starts and calls mre.WaitOne()
    
    When all three threads have started, press Enter to call Set()
    to release all the threads.
    
    
    Thread_2 ends.
    Thread_0 ends.
    Thread_1 ends.
    
    When a ManualResetEvent is signaled, threads that call WaitOne()
    do not block. Press Enter to show this.
    
    
    Thread_3 starts and calls mre.WaitOne()
    Thread_3 ends.
    Thread_4 starts and calls mre.WaitOne()
    Thread_4 ends.
    
    Press Enter to call Reset(), so that threads once again block
    when they call WaitOne().
    
    
    Thread_5 starts and calls mre.WaitOne()
    
    Press Enter to call Set() and conclude the demo.
    
    Thread_5 ends.
    ManualResetEvent 클래스의 출력 결과와 AutoResetEvent 출력 결과의 가장 큰 차이점은 다음과 같습니다.
    수동으로 Reset하지 않으면 Set 메서드가 호출되면 ManualReset Event.WaitOne()이 막히지 않습니다.
    그러나 AutoReset Event는 자동으로 Reset되므로 수동으로 Reset하지 않더라도 AutoReset Event는 한 번씩입니다.WaitOne () 은 스레드를 계속하기 위해 트리거하는 Set 메서드가 필요합니다.
    이상은 C#라인의 끊기와 깨우기에 대한 상세한 내용입니다. C#라인의 끊기와 깨우기에 대한 더 많은 자료는 저희 다른 관련 글을 주목해 주십시오!

    좋은 웹페이지 즐겨찾기