Latest web development tutorials

C #을 멀티 스레딩

스레드 프로그램의 실행 경로로서 정의된다.각 스레드는 제어의 독특한 흐름을 정의합니다. 애플리케이션이 복잡하고 시간 소모적 인 작업을 수반하는 경우, 상이한 실행 경로를 설정하는 것이 유용 스레드 각각의 스레드가 특정 작업을 수행한다.

스레드는경량 프로세스입니다.일반적인 예는 최신 운영 시스템 구현의 병렬 프로그래밍 스레드의 사용이다. 애플리케이션의 효율성을 향상시키는 동시에, 환경 CPU 사이클을 절약 스레드를 사용.

지금까지 우리는 프로그램이 단일 스레드 응용 프로그램 인스턴스가 실행되는 실행하는 하나의 과정입니다 준비했습니다. 그러나, 이러한 응용 프로그램은 같은 시간에 하나의 작업을 수행 할 수있다. 동시에 여러 작업을 수행하기 위해서는, 더 작은 스레드로 나눌 수있다.

스레드 생명주기

스레드 라이프 사이클은 끝이 종료 또는 실행 스레드에서 완료, System.Threading.Thread 클래스 객체가 생성이 시작됩니다.

다음 목록 스레드 라이프 사이클의 상태 :

  • 스레드 인스턴스가 작성되면,하지만 방법은 시작 조건 호출되지 않습니다: 상태는 시작되지 않습니다.
  • 준비 상태 : 스레드가 CPU 사이클과 조건 대기하는 경우에 실행할 준비가.
  • 상태를 비 작동 : 다음 상황 스레드에서 실행되지 않습니다

    • 방법은 수면 호출 된
    • 이 방법은 대기 호출 된
    • I / O 작업을 방해함으로써
  • 죽음의 상태 : 스레드가 완료 실행 또는 중단 상태에있는 경우.

주 스레드

스레드 작업 C#에서, System.Threading.Thread 클래스입니다.그것은 당신이 만들고 하나의 쓰레드에서 다중 스레드 응용 프로그램에 액세스 할 수 있습니다. 실행하는 프로세스의 첫 번째 스레드는기본 스레드 불린다.

C # 프로그램 실행을 시작하면, 메인 쓰레드가 자동으로 생성됩니다. 스레드를 생성하기 위해스레드 클래스를 사용하면 메인 쓰레드 자식 스레드라고합니다.당신은 Thread 클래스CurrentThread 속성 액세스 스레드를 사용할 수 있습니다.

다음 프로그램은 메인 쓰레드의 실행을 보여

시스템을 이용하여;
하여 System.Threading을 사용함;

네임 스페이스 MultithreadingApplication
{
    클래스 MainThreadProgram
    {
        정적 무효 메인 (문자열 []에 인수)
        {
            =는 Thread.currentThread 번째 스레드;
            th.Name = "MainThread";
            Console.WriteLine (th.Name "이 {0}입니다");
            Console.ReadKey ();
        }
    }
}

상기 코드는 컴파일되고 실행될 때, 다음과 같은 결과를

이 MainThread입니다

Thread 클래스 일반적인 속성과 메소드

다음 표는 몇 가지 일반적인속성 Thread클래스를 나열합니다:

属性描述
CurrentContext获取线程正在其中执行的当前上下文。
CurrentCulture获取或设置当前线程的区域性。
CurrentPrinciple获取或设置线程的当前负责人(对基于角色的安全性而言)。
CurrentThread获取当前正在运行的线程。
CurrentUICulture获取或设置资源管理器使用的当前区域性以便在运行时查找区域性特定的资源。
ExecutionContext获取一个 ExecutionContext 对象,该对象包含有关当前线程的各种上下文的信息。
IsAlive获取一个值,该值指示当前线程的执行状态。
IsBackground获取或设置一个值,该值指示某个线程是否为后台线程。
IsThreadPoolThread获取一个值,该值指示线程是否属于托管线程池。
ManagedThreadId获取当前托管线程的唯一标识符。
Name获取或设置线程的名称。
Priority获取或设置一个值,该值指示线程的调度优先级。
ThreadState获取一个值,该值包含当前线程的状态。

다음 표는 몇 가지 일반적으로 사용되는방법 Thread클래스를 나열합니다:

序号方法名 & 描述
1public void Abort()
在调用此方法的线程上引发 ThreadAbortException,以开始终止此线程的过程。调用此方法通常会终止线程。
2public static LocalDataStoreSlot AllocateDataSlot()
在所有的线程上分配未命名的数据槽。为了获得更好的性能,请改用以 ThreadStaticAttribute 属性标记的字段。
3public static LocalDataStoreSlot AllocateNamedDataSlot( string name)
在所有线程上分配已命名的数据槽。为了获得更好的性能,请改用以 ThreadStaticAttribute 属性标记的字段。
4public static void BeginCriticalRegion()
通知主机执行将要进入一个代码区域,在该代码区域内线程中止或未经处理的异常的影响可能会危害应用程序域中的其他任务。
5public static void BeginThreadAffinity()
通知主机托管代码将要执行依赖于当前物理操作系统线程的标识的指令。
6public static void EndCriticalRegion()
通知主机执行将要进入一个代码区域,在该代码区域内线程中止或未经处理的异常仅影响当前任务。
7public static void EndThreadAffinity()
通知主机托管代码已执行完依赖于当前物理操作系统线程的标识的指令。
8public static void FreeNamedDataSlot(string name)
为进程中的所有线程消除名称与槽之间的关联。为了获得更好的性能,请改用以 ThreadStaticAttribute 属性标记的字段。
9public static Object GetData( LocalDataStoreSlot slot )
在当前线程的当前域中从当前线程上指定的槽中检索值。为了获得更好的性能,请改用以 ThreadStaticAttribute 属性标记的字段。
10public static AppDomain GetDomain()
返回当前线程正在其中运行的当前域。
11public static AppDomain GetDomainID()
返回唯一的应用程序域标识符。
12public static LocalDataStoreSlot GetNamedDataSlot( string name )
查找已命名的数据槽。为了获得更好的性能,请改用以 ThreadStaticAttribute 属性标记的字段。
13public void Interrupt()
中断处于 WaitSleepJoin 线程状态的线程。
14public void Join()
在继续执行标准的 COM 和 SendMessage 消息泵处理期间,阻塞调用线程,直到某个线程终止为止。此方法有不同的重载形式。
15public static void MemoryBarrier()
按如下方式同步内存存取:执行当前线程的处理器在对指令重新排序时,不能采用先执行 MemoryBarrier 调用之后的内存存取,再执行 MemoryBarrier 调用之前的内存存取的方式。
16public static void ResetAbort()
取消为当前线程请求的 Abort。
17public static void SetData( LocalDataStoreSlot slot, Object data )
在当前正在运行的线程上为此线程的当前域在指定槽中设置数据。为了获得更好的性能,请改用以 ThreadStaticAttribute 属性标记的字段。
18public void Start()
开始一个线程。
19public static void Sleep( int millisecondsTimeout )
让线程暂停一段时间。
20public static void SpinWait( int iterations )
导致线程等待由 iterations 参数定义的时间量。
21public static byte VolatileRead( ref byte address )
public static double VolatileRead( ref double address )
public static int VolatileRead( ref int address )
public static Object VolatileRead( ref Object address )

读取字段值。无论处理器的数目或处理器缓存的状态如何,该值都是由计算机的任何处理器写入的最新值。此方法有不同的重载形式。这里只给出了一些形式。
22public static void VolatileWrite( ref byte address, byte value )
public static void VolatileWrite( ref double address, double value )
public static void VolatileWrite( ref int address, int value )
public static void VolatileWrite( ref Object address, Object value )

立即向字段写入一个值,以使该值对计算机中的所有处理器都可见。此方法有不同的重载形式。这里只给出了一些形式。
23public static bool Yield()
导致调用线程执行准备好在当前处理器上运行的另一个线程。由操作系统选择要执行的线程。

스레드를 생성

스레드는 스레드 클래스를 확장하여 만들어집니다. 임원 확장 스레드 클래스는 자식 스레드를 시작하는시작 () 메서드를 호출합니다.

다음 프로그램은이 개념을 설명합니다 :

시스템을 이용하여;
하여 System.Threading을 사용함;

네임 스페이스 MultithreadingApplication
{
    클래스 ThreadCreationProgram
    {
        공공 정적 무효 CallToChildThread ()
        {
            Console.WriteLine ( "자식 스레드가 시작");
        }
        
        정적 무효 메인 (문자열 []에 인수)
        {
            ThreadStart childref = 새로운 ThreadStart (CallToChildThread);
            Console.WriteLine ( "메인에서 : 아동 스레드를 생성");
            childThread = 새 스레드 (childref)를 스레드;
            childThread.Start ();
            Console.ReadKey ();
        }
    }
}

상기 코드는 컴파일되고 실행될 때, 다음과 같은 결과를

홈페이지에서 : 아동 스레드를 생성
자식 스레드 시작

관리 스레드

스레드 스레드 클래스는 관리 다양한 방법을 제공합니다.

다음 예제는 특정 시간 제한 스레드에서 사용되는수면 () 메소드를 사용하는 방법을 보여줍니다.

시스템을 이용하여;
하여 System.Threading을 사용함;

네임 스페이스 MultithreadingApplication
{
    클래스 ThreadCreationProgram
    {
        공공 정적 무효 CallToChildThread ()
        {
            Console.WriteLine ( "자식 스레드가 시작");
            // 스레드는 5000 밀리 초 INT sleepfor = 5000 일시 중지; 
            Console.WriteLine는 ( "자식 스레드 {0} 초 동안 일시 중지" 
                              sleepfor / 1000);
            Thread.sleep를 (sleepfor);
            Console.WriteLine ( "자식 스레드는 다시 시작");
        }
        
        정적 무효 메인 (문자열 []에 인수)
        {
            ThreadStart childref = 새로운 ThreadStart (CallToChildThread);
            Console.WriteLine ( "메인에서 : 아동 스레드를 생성");
            childThread = 새 스레드 (childref)를 스레드;
            childThread.Start ();
            Console.ReadKey ();
        }
    }
}

상기 코드는 컴파일되고 실행될 때, 다음과 같은 결과를

홈페이지에서 : 아동 스레드를 생성
자식 스레드 시작
자식 스레드는 5 초 동안 일시 중지
자식 스레드 이력서

스레드를 파괴

중단 () 메소드는 스레드를 파괴하는 데 사용됩니다.

ThreadAbortException이 던지는하여 런타임에 스레드를 중단.마지막으로차단하면이 예외는, 발견 할 수없는 제어가finally블록을 전송됩니다.

다음 프로그램은이 점을 보여

시스템을 이용하여;
하여 System.Threading을 사용함;

네임 스페이스 MultithreadingApplication
{
    클래스 ThreadCreationProgram
    {
        공공 정적 무효 CallToChildThread ()
        {
            시험
            {

                Console.WriteLine ( "자식 스레드가 시작");
                10 카운트 //
                대한 (INT 카운터 = 0; 카운터 <= 10; 카운터 ++)
                {
                    Thread.sleep를 (500);
                    Console.WriteLine (카운터);
                }
                Console.WriteLine ( "자식 스레드 완료");

            }
            캐치 (ThreadAbortException이 전자)
            {
                Console.WriteLine ( "스레드 중단 예외");
            }
            최종적으로
            {
                Console.WriteLine ( "스레드 예외를 잡을 수 없습니다");
            }

        }
        
        정적 무효 메인 (문자열 []에 인수)
        {
            ThreadStart childref = 새로운 ThreadStart (CallToChildThread);
            Console.WriteLine ( "메인에서 : 아동 스레드를 생성");
            childThread = 새 스레드 (childref)를 스레드;
            childThread.Start ();
            // 몇 시간 Thread.sleep를 (2000)의 주 스레드를 중지;
            // 이제 중단 자식 스레드 Console.WriteLine을 ( "메인에서 : 아동 스레드를 중단");
            childThread.Abort ();
            Console.ReadKey ();
        }
    }
}

상기 코드는 컴파일되고 실행될 때, 다음과 같은 결과를

홈페이지에서 : 아동 스레드를 생성
자식 스레드 시작
0
(1)
이
홈페이지에서 : 아동 스레드를 중단
중단 예외 스레드
스레드 예외를 잡을 수 없습니다