025.Thread/Task
반응형

25번째까지 왔다...

 

사실 내가 적으면서도... 약간 대충 적는것도 있고... 큰 설명을 적지않는거 같아 좀 그렇지만.

 

꼭 필요한 부분들은 적는거 같으니......

 

세세한 내용은 msdn이나...stackoverflow를......

 

일단..

 

이번엔

 

Task와 Thread다..

 

사실 프로그래밍을 하다보면 일반적으로 thread를 굉장히 많이 쓰게 된다...

 

그러면서도 어려운게 thread...... thread형태로 가면 WPF 경우 UI Thread와의 충돌도 생길수 있고...

 

lock 부분의 문제도 생길수 있고 (이부분은 2021.10.19 - [사소한 아이의 소소한 스킬/C#] - 001. Thread Safe) 이거를 추가로 함 봐보자!!

 

아무튼....

 

그리하여 thread와 task 사용법에 대해 한번 작성해보자...

 

사실 thread와 task의 사용법은 어렵지 않다..

 

사용법은 new로 선언하고 실행될 함수 설정해주고, start, stop 해주면 되는 수준.

 

그리하여 code로 보면

 

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.Remoting.Contexts;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
namespace TestProject
{
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>    
    public partial class MainWindow : Window
    {
 
        public MainWindow()
        {
            InitializeComponent();
 
            Task.Run(() => task_aaa());
            Task.Run(() => task_bbb());
 
            Thread T1 = new Thread(new ThreadStart(thread_aaa));
            Thread T2 = new Thread(new ThreadStart(thread_bbb));
            T1.Start();
            T2.Start();
        }
 
        public void thread_aaa()
        {
            Thread.Sleep(5000);
 
            if (lb2.Dispatcher.CheckAccess())
            {
                //UI 쓰레드인 경우
                lb2.Content += "aaa" + Environment.NewLine;
            }
            else
            {
                // 작업쓰레드인 경우
                lb2.Dispatcher.BeginInvoke(new Action(thread_aaa));
            }
        }
 
        public void thread_bbb()
        {
            if (lb2.Dispatcher.CheckAccess())
            {
                //UI 쓰레드인 경우
                lb2.Content += "bbb" + Environment.NewLine;
            }
            else
            {
                // 작업쓰레드인 경우
                lb2.Dispatcher.BeginInvoke(new Action(thread_bbb));
            }
        }
 
        public void task_aaa()
        {
            Thread.Sleep(5000);
 
            if (lb1.Dispatcher.CheckAccess())
            {
                //UI 쓰레드인 경우
                lb1.Content += "aaa" + Environment.NewLine;
            }
            else
            {
                // 작업쓰레드인 경우
                lb1.Dispatcher.BeginInvoke(new Action(task_aaa));
            }
        }
 
        public void task_bbb()
        {
            if (lb1.Dispatcher.CheckAccess())
            {
                //UI 쓰레드인 경우
                lb1.Content += "bbb" + Environment.NewLine;
            }
            else
            {
                // 작업쓰레드인 경우
                lb1.Dispatcher.BeginInvoke(new Action(task_bbb));
            }
        }
    }
}
 
cs

 

이렇다.......... 뭐 없죠?

 

task를 new로 선언 한 후 run함수를 통해 실행할 함수를 설정해주면 실행이 되고

 

thread를 new로 선언 한 후 threadstart를 통해 실행할 함수를 설정해주고 start를 해서 실행해준다.

 

이게 간단하게 끝이다.

 

예시에는 thread에서 label의 Content를 변경해주도록 되어있는데.. 이때 WPF의 UI Thread에 접근해야하므로 Dispatcher의 Access를 확인 한 후 Content를 넣어주도록만 한것이다.

UI Thread처리는 추후에 다시 한번 작성하는 걸로....

 

기본적인 사용법은 위와 같고, 실행 함수내에서의 처리 알고리즘만 변경해서 사용하면 될 듯 싶다.

 

또 다음에는 비동기 Thread형태로 확인해보도록 해야겠다..

반응형