C# 에서 비동기를 위한 분기를 만드는 기법중에선
Thread 와 Task 가 있다.
결론적으로 말하면 굳이 Thread 를 사용할 필요는 없다.
우선 Task 부터 설명 하겠다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
using System;
using System.Threading;
using System.Threading.Tasks;
class Example
{
static void aaa()
{
Thread.Sleep(5000);
Console.WriteLine("aaa");
}
static void bbb()
{
Console.WriteLine("bbb");
}
static void Main()
{
Task t1 = new Task(aaa);
Task t2 = new Task(bbb);
t1.Start();
t2.Start();
//t1.Wait();
}
}
|
cs |
람다식을 사용해도 무방하나 가장 기본식으로 설명하므로 필요하면 찾아보길 바란다.
위 간단한 코드 내의 Task 는 다음과 같이 동작한다.
Task 객체를 생성하여 해당 객체를 따라 실행될 Method 를 지정 해 주면
해당 Method 가 start 함수가 호출되면 '따라서' 실행되는 구조이며.
wait 함수로는 해당 객체가 종료될 때 까지 기다리는 역할을 수행한다.
따라서 위와 같은 식을 실행했을 때
위와 같은 두 가지 결과 중 하나를 얻을 수 있다.
두 번째 결과는 t2 가 끝마쳐지기 전에 Main 함수가 종료되어 나타나는 현상이다.
따라서 wait 함수를 반드시 종료 지점에 명시 해 주어야 하는 것이다 (특별한 의도가 없다면)
그리고 만약 위 함수에서 주석부분인 //t1.wait 를 지우고 실행한다면
위와 같은 결과가 출력 되게 된다.
여기서 //t2.wait 을 '생략' 했지만
t1 만 실행되면 되고, t2의 실행 여부는 중요하지 않은 코드가 아니라면,
t2.wait 를 붙여 주어야 한다. 반드시.
다음으로 Thread 이다.
Thread 도 크게 다를 바 없다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
using System;
using System.Threading;
class Example
{
static void aaa()
{
Thread.Sleep(5000);
Console.WriteLine("aaa");
}
static void bbb()
{
Console.WriteLine("bbb");
}
static void Main()
{
Thread t1 = new Thread(aaa);
Thread t2 = new Thread(bbb);
t1.Start();
t2.Start();
}
}
|
cs |
Task 와 크게 다르지 않으며, 역시 Start 함수로 쓰레드를 실행한다.
여기서 차이점은 Thread 객체의 경우는,
따로 wait 시그널을 보내지 않았음에도 불구하고 알아서 aaa 가 끝나기를 기다렸다는 점에서 차이가 있다.
이것이 사용자 입장에서의 Task 와 Thread 의 차이점이라고 볼 수 있는데,
솔직히 말해서 사용 용도 측면에서는 큰 차이가 나지 않는다,
'Programming > C#' 카테고리의 다른 글
[C#] 델리게이트와 이벤트의 차이점 (0) | 2021.03.04 |
---|---|
[C#] IEnumerable 인터페이스 상속 및 객체 열거형 만들기 (0) | 2021.03.03 |
[C#] 형변환 [as, is] (0) | 2021.02.27 |
[C#] 인터페이스 사용 이유. (0) | 2020.12.14 |
[C#] C++ DLL 을 사용하기. (0) | 2020.09.09 |