반응형
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 |
반응형
'프로그래밍 언어 > C#' 카테고리의 다른 글
[C#] 엑셀(Excel) - 글자 색상 변경 (0) | 2024.03.18 |
---|---|
[C#] 프로그램에서 URL 열기, 브라우저 설정 (0) | 2023.12.18 |
[C#] WinForm 의 모든 컨트롤 가져오기 (0) | 2022.01.07 |
[C#] 문자열 자르기(Substring, Split) (2) | 2021.04.20 |
[C#] 물음표(?) 연산자 사용 방법 (0) | 2021.04.19 |
댓글