본문 바로가기
프로그래밍 언어/C#

Task / Thread 차이점, Task 사용법

by Jinwood 2022. 10. 25.
반응형

Task는 구현하고 싶은 작업 자체를 의미하며,
Thread는 구현하고 싶은 작업을 수행하는 수많은 작업자들 중 하나를 의미한다.

Task를 사용하면 어디에서 실제로 해당 작업을 수행했는지 신경 쓰지 않기 때문에 실행자를 제어할 수 없다.
(전체 프로세스가 하나의 스레드에 의해 처리되는지 / 멀티 스레드로 처리되는지 모름)

결론 :
실행 중인 작업을 언제든지 중지할 수 있는 제어 수준 필요 : Thread 사용
실행 중인 작업이 완료된 후 중지되는 정도의 제어 수준 필요 : Task 사용
(반복문 내에서 CancellationToken을 사용하면 중지할 수 있지만, 해당 반복문을 진행한 뒤 중지됨)

Task 사용 예 1 (비동기 메서드로 적용)

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
29
using System.Threading.Tasks;
private async void Update_Listview(List<string> selected_strings) // async 추가
{
    try
    {  
        await Task.Run(() =>
        {
            for (int k = 0; k < selected_strings.Count; k++)
            {
                // 필요한 코드 작성
                lstVwItem item = new lstVwItem
                {
                    Text = selected_strings[k]
                };
 
                Dispatcher.Invoke(() => lstVwItemList.Add(item));
            }
        }
        );
 
    }
    catch (Exception err)
    {
        System.Windows.Forms.MessageBox.Show("error occured", err.Message + "\n\n" + err.StackTrace);
    }
    finally
    {
    }
}
cs


Task 사용 예 2 (동기 메서드로 적용)

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
29
30
31
using System.Threading.Tasks;
public void Update_Listview(List<string> selected_strings)
{
    try
    {
        Task task = Task.Factory.StartNew(() => Add_To_Listview(selected_strings));
        Task.WaitAll(new Task[] { task });
    }
    catch (Exception err)
    {
        System.Windows.Forms.MessageBox.Show("error occured", err.Message + "\n\n" + err.StackTrace);
    }
    finally
    {
 
    }
}
 
public void Add_To_Listview(List<string> selected_strings)
{
    for (int k = 0; k < selected_strings.Count; k++)
    {
        // 필요한 코드 작성
        lstVwItem item = new lstVwItem
        {
            Text = selected_strings[k]
        };
 
        Dispatcher.Invoke(() => lstVwItemList.Add(item));
    }
}
cs
반응형

댓글