- 홈
- C# 문법
- C# 최신기능
- C# 윈폼
- 코딩가이드
- C# 데이타
- C# 활용
- C# 개발팁
- C# 자료구조
- C# 멀티쓰레딩
- C# 권장도서
- C# 웹프로그래밍
- C# 네트워크
- C# 알고리즘 퀴즈
- C# 비트코인
- 개발자노트
- C# 실수
- C# 스토리
- C# 초보캠프
C# 멀티쓰레딩 | Thread 클래스 |
| Thread 클래스(2) |
| ThreadPool 클래스 |
| 비동기 델리게이드 |
| BackgroundWorker |
| Task 클래스 |
| Task Of T 클래스 |
| Parallel 클래스 |
| C# 5.0 await |
| C# 타이머 |
| UI 쓰레드 |
| 쓰레드 동기화 |
| C# lock 블럭 |
| Monitor 클래스 |
| Mutex 클래스 |
| Semaphore 클래스 |
| AutoResetEvent클래스 |
| ManualResetEvent |
| CountdownEvent |
C# Task 클래스 Task 클래스와 이의 Generic형태인 Task<T>클래스는 .NET 4.0에 도입된 새로운 클래스들로서 쓰레드풀로부터 쓰레드를 가져와 비동기 작업을 실행한다. Task 관련 클래스들과 Parallel 클래스들을 합쳐 Task Parallel Library(TPL)이라 부르는데, 이들은 기본적으로 다중 CPU 병렬 처리를 염두에 두고 만들었다. Task 클래스는 .NET 4.0 이전 버전의 ThreadPool.QueueUserWorkItem()와 같은 기능을 제공하지만, 보다 빠르고 유연한 기능을 갖추고 있다. Task클래스 사용을 위해 흔히 사용되는 방법은 Task.Factory.StartNew()를 사용하여 실행하고자 하는 메서드에 대한 델리케이트를 지정하는 것이다. 이 StartNew()는 쓰레드를 생성과 동시에 실행하는 방식이고, 만약 시작을 하지 않고 Task 객체를 만들기 위해서는 Task() 생성자를 사용하여 메서드 델리게이트를 지정한다. 예제
namespace MultiThrdApp { using System; using System.Threading.Tasks; class Program { static void Main(string[] args) { // Task.Factory를 이용하여 쓰레드 생성과 시작 Task.Factory.StartNew(new Action<object>(Run), null); Task.Factory.StartNew(new Action<object>(Run), "1st"); Task.Factory.StartNew(Run, "2nd"); Console.Read(); } static void Run(object data) { Console.WriteLine(data == null ? "NULL" : data); } } }
C# Task 클래스 위의 Task.Factory.StartNew()는 쓰레드를 생성과 동시에 시작하는 방식이고, 만약 시작을 하지 않고 Task 객체만을 먼저 만들기 위해서는 Task 클래스 생성자를 사용하여 메서드 델리게이트를 지정, Task 객체만을 생성한다. 생성된 Task 객체로부터 실제 쓰레드를 시작하기 위해서는 Start() 메서드를 호출하고, 종료때까지 기다리기 위해선 Wait() 메서드를 호출한다. 예제
namespace MultiThrdApp { using System; using System.Threading.Tasks; class Program { static void Main(string[] args) { // Task 생성자에 Run을 지정 Task 객체 생성 Task t1 = new Task(new Action(Run)); // 람다식을 이용 Task객체 생성 Task t2 = new Task(() => { Console.WriteLine("Long query"); }); // Task 쓰레드 시작 t1.Start(); t2.Start(); // Task가 끝날 때까지 대기 t1.Wait(); t2.Wait(); } static void Run() { Console.WriteLine("Long running method"); } } }
본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다. 이전 코멘트 모두 보기
 | novuslee@*** | 2/13/2019 4:15:06 AM |
| 친절하고 빠른 답변 정말 감사합니다^^ 복 많이 받으세요 Alex Lee가 좋아합니다 |
 | kbsand1@*** | 8/4/2020 9:14:24 AM |
| 안녕하십니까, 선생님 17년도에 이 홈페이지를 알게되어 가끔씩 방문하여 개념을 얻어가곤했습니다. 3년만에 인사드리는 점 죄송합니다! Task 클래스 이용시 Start, Run, Factory.StartNew 이 3가지의 각 차이점이 무엇인지 가르침 받고 싶습니다. 감사합니다! |
 | admin@*** | 8/5/2020 6:24:18 AM |
| @kbsand1: 여러가지 상세한 부분이 있지만, 크게 Start는 이미 생성된 Task를 실행하는 메서드이고, Factory.StartNew는 task를 생성하면서 동시에 시작하는 메서드입니다. Run은 Task에 있는 여러 옵션들을 디폴트로 하고 간단하게 task를 실행하도록 하는 (즉, 복잡한 것은 단순하게 만든) Wrapper 메서드입니다. |
 | ckdqja5022@*** | 9/9/2020 7:32:12 PM |
| 안녕하십니까, c#을 공부하면서 선생님이 올려주신 자료 잘 보고 있습니다 Task의 중지 재시작 관련하여 질문드립니다 현재 Task_start_scan()이라는 이름으로 start_scan()이라는 함수를 Task화 해두었고 cts_1 = new CancellationTokenSource(); token_1 = cts_1.Token; 라고 선언한뒤 start_scan()내에서 매 반복마다 token_1.ThrowIfCancellationRequested()를 이용해 작업이 중지되었는지 여부를 확인하는 형태로 코드를 작성하였습니다 즉 제가 원할때 cts_1.cancel()을 호출하게 되면 start_scan작업을 중지하는것까지는 가능한 상황입니다. 현재 막힌 부분은 중지이후에 다시 시작을 위해 Task_start_scan.start()호출시에 "완료된 Task에서 start를 호출할수 없습니다"라는 error가 발생합니다. 제가 이해한 바로는 cts_1.cancel은 Task의 일시정지가 아닌 종료로 알고있고 error역시 '완료된 task'로 나오는 것으로 보아 재시작시 문제가 발생하지 않을것으로 보이는데 이에 관해 도움을 부탁드립니다. 두서 없는 질문에 답변해주시는것에 미리 감사드립니다. |
 | admin@*** | 9/10/2020 1:35:05 AM |
| @ckdqja5022: 한번 완료된(혹은 취소된) Task를 다시 restart할 수 없으며, 새 Task 객체를 생성해서 Start해야 합니다. |
"예제로 배우는" 시리즈 - 예제로 배우는 Python
- 예제로 배우는 GO 프로그래밍
- 예제로 배우는 SQL 프로그래밍
- 예제로 배우는 Rust
- Crypto 스터디 (암호학/암호화폐)

유용한 외부 링크
- C# Tips / 퀴즈
- 성태의 닷넷이야기
- .NET 관련 블로그
- WinDbg 디버깅 사이트
- 온라인 HTML 인코더
- SQL 개발자를 위한 String Pad
Home | Privacy
| Copyright © 2011-2026 CSHARPSTUDY.COM |