025.Thread/Task

2021. 11. 5. 18:00·사소한 아이의 소소한 스킬/C#
반응형

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));
            }
        }
    }
}
 
Colored by Color Scripter
cs

 

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

 

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

 

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

 

이게 간단하게 끝이다.

 

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

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

 

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

 

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

반응형
'사소한 아이의 소소한 스킬/C#' 카테고리의 다른 글
  • 028. UI Thread
  • 027. 압축설정/압축해제
  • 024. Chart
  • 023. String Operator
JOOJI
JOOJI
그냥 혼자좋아하는 것들 남기는 블로그....
  • JOOJI
    사소한프로그래머의 소소한행복
    JOOJI
  • 전체
    오늘
    어제
    • 분류 전체보기 (963)
      • 사소한 아이의 소소한 일상 (246)
      • 사소한 아이의 소소한 먹거리 (44)
      • 사소한 아이의 소소한 정보 (75)
      • 사소한 아이의 소소한 감사 (4)
      • 사소한 아이의 소소한 운동 (63)
      • 사소한 아이의 소소한 여행 (40)
        • 2013_전주 (1)
        • 2014_독일 (13)
        • 2014_군산 (1)
        • 2015_제주도 (3)
        • 2015_서울모토쇼 (3)
        • 2015_진해 (1)
        • 2015_전주 (1)
        • 2016_여수 (1)
        • 2020_강릉 (1)
        • 2022_제주도 (4)
      • 사소한 아이의 소소한 강짱 (22)
        • 하트투하트 (10)
        • MAPS (1)
        • 화려한 유혹 (2)
        • 한여름의 추억 (2)
      • 사소한 아이의 TV (50)
        • Drama (9)
        • 예능 (32)
        • 사소한 아이의 다현 (9)
      • 사소한 아이의 소소한 스킬 (130)
        • Scaleform (2)
        • C# (74)
        • QT (3)
        • 알고리즘 (4)
        • Python (21)
        • PyQT5 (9)
        • C_C++ (2)
      • 사소한 아이의 소소한 축구 (283)
        • Korea (25)
        • Germany (45)
        • Bayern Munich (64)
        • Soccer_ETC (75)
        • Euro 2016 (12)
        • 친선경기 (3)
      • 사소한 아이의 소소한 생활정보 (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
    • 관리
  • 링크

    • 독일여행
    • 레바티스토리
    • 프라치노 공간
    • 남성패션꿀템 블로그
  • 공지사항

  • 인기 글

  • 태그

    바이에른 뮌헨
    회사밥
    c#
    독일
    뮌헨
    분데스리가
    WPF
    러닝
    문제
    python
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
JOOJI
025.Thread/Task
상단으로

티스토리툴바