using System;
using System.Threading;
namespace ConsoleApp2
{
class Program
{
static void newThreading()
{
Console.WriteLine("First Line");
Thread.Sleep(1000);
Console.WriteLine("1 sec later");
}
static void Main(string[] args)
{
Console.WriteLine("Main Function Start");
Thread thread = new Thread(newThreading);
thread.Start();
Console.WriteLine("Main Function is Down");
}
}
}
C#의 경우 C++과는 다르게 기본값으로 Thread Function을 실행 시 Foreground에서 작동된다. C++에서는 기본 값으로 Background에서 실행되는데 이 설정의 차이는 메인 쓰레드가 종료될 시 같이 종료되면 Background, 메인 쓰레드가 종료돼도 여전히 작동한다면 Foreground 이다.
몇 가지 Thread에 유용한 함수가 존재한다.
static void newThreading()
{
Console.WriteLine("First Line");
Thread.Sleep(1000);
Console.WriteLine("1 sec later");
}
static void Main(string[] args)
{
Console.WriteLine("Main Function Start");
Thread thread = new Thread(newThreading);
thread.Start();
thread.Join();
Console.WriteLine("Main Function is Down");
}
다음과 같이 Join 함수를 쓰면 해당 쓰레드가 종료될 때까지 wait상태가 된다.
C#에서는 사용자의 편의를 위해서 쓰레드 풀을 미리 만들어줬다.
static void newThreading(Object obj)
{
Console.WriteLine("First Line");
Thread.Sleep(1000);
Console.WriteLine("1 sec later");
}
static void Main(string[] args)
{
Console.WriteLine("Main Function Start");
ThreadPool.QueueUserWorkItem(newThreading);
Thread.Sleep(2000);
Console.WriteLine("Main Function is Down");
}
ThreadPool은 따로 객체로 인스턴스화 할 필요없다.
ThreadPool을 사용할 때 Thread와의 차이점이 존재한다.
1. 넘겨주는 함수의 파라미터로 Object를 넘겨줘야 한다.
2. 기본 설정이 Background로 Main Thread가 끝나면 쓰레드 풀에서 실행되는 것도 끝난다.
몇 가지 함수를 설명하면
QueueUserWorkItem은 작업 큐에 작업을 진행할 함수를 넣어준다.
GetMaxThreads는 동시에 활성 상태가 될 수 있는 스레드 풀에 대한 값을 리턴한다.
SetMaxThreads는 동시에 활성 상태가 될 수 있는 스레드 풀에 대한 값을 설정합니다.
Task는 일반적으로 비동기적으로 실행되는 단일 작업이다.
주 애플리케이션 스레드에서 동기적으로 실행되지 않고, 스레드 풀 쓰레드로써 비동기적으로 실행된다.
static void newThreading()
{
Console.WriteLine("First Line");
Thread.Sleep(1000);
Console.WriteLine("1 sec later");
}
static void Main(string[] args)
{
Task task = new Task(newThreading);
Console.WriteLine("Main Function Start");
task.Start();
task.Wait();
Console.WriteLine("Main Function is Down");
}
Wait는 Thread의 join과 같은 뜻으로 사용된다.
Task가 스레드 풀에서 작동하다보니 기본 값 또한 Background에서 실행된다.