- 홈
- 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# 쓰레드의 생성 (Thread 클래스) C#에서 쓰레드를 만드는 기본적인 클래스로 System.Threading.Thread라는 클래스가 있다. 이 클래스의 생성자(Constructor)에 실행하고자 하는 메서드를 델리게이트로 지정한 후, Thread클래스 객체에서 Start() 메서드를 호출하면 새로운 쓰레드가 생성되어 실행되게 된다. 아래 예는 동일 클래스 안의 Run() 메서드를 실행하는 쓰레드를 하나 생성한 후 실행시키는 예제이다. 예제에서는 기본적으로 생성된 메인 쓰레드에서도 동일하게 Run()메서드를 호출하고 있으므로, Begin/End문장이 2번 출력되고 있는데, 이는 2개의 쓰레드가 동시에 한 메서드를 실행하고 있기 때문이다. 예제
namespace MultiThrdApp { using System; using System.Threading; class Program { static void Main(string[] args) { new Program().DoTest(); } void DoTest() { // 새로운 쓰레드에서 Run() 실행 Thread t1 = new Thread(new ThreadStart(Run)); t1.Start(); // 메인쓰레드에서 Run() 실행 Run(); } // 출력 // Thread#1: Begin // Thread#3: Begin // Thread#1: End // Thread#3: End void Run() { Console.WriteLine("Thread#{0}: Begin", Thread.CurrentThread.ManagedThreadId); // Do Something Thread.Sleep(3000); Console.WriteLine("Thread#{0}: End", Thread.CurrentThread.ManagedThreadId); } } }
C# 동영상 강의 : C# Thread 사용하기 [레벨] 고급 [C# Advanced] 쓰레드(Thread)의 기본 개념과 C# 에서 쓰레드를 사용하는 방법에 대해 자세히 설명합니다. |
C# 쓰레스 생성의 다양한 예제 이 섹션은 .NET의 Thread 클래스를 이용해 쓰레드를 만드는 다양한 예를 들고 있다. Thread클래스의 생성자가 받아들이는 파라미터는 ThreadStart 델리게이트와 ParameterizedThreadStart 델리게이트가 있는데, 이 섹션은 파라미터를 직접 전달하지 않는 메서드들에 사용하는 ThreadStart 델리게이트 사용 예제를 보여준다. ThreadStart 델리게이트는 public delegate void ThreadStart();와 같이 정의되어 있는데, 리턴값과 파라미터 모두 void임을 알 수 있다. 따라서 파라미터와 리턴값이 없는 메서드는 델리게이트 객체로 생성될 수 있다. 아래 예에서 보이듯이, ThreadStart 델리게이트를 만족하는 다른 방식들 즉, 익명 메서드, 람다식 등도 모두 사용할 수 있다. 예제
class Program { static void Main(string[] args) { // Run 메서드를 입력받아 // ThreadStart 델리게이트 타입 객체를 생성한 후 // Thread 클래스 생성자에 전달 Thread t1 = new Thread(new ThreadStart(Run)); t1.Start(); // 컴파일러가 Run() 메서드의 함수 프로토타입으로부터 // ThreadStart Delegate객체를 추론하여 생성함 Thread t2 = new Thread(Run); t2.Start(); // 익명메서드(Anonymous Method)를 사용하여 // 쓰레드 생성 Thread t3 = new Thread(delegate() { Run(); }); t3.Start(); // 람다식 (Lambda Expression)을 사용하여 // 쓰레드 생성 Thread t4 = new Thread(() => Run()); t4.Start(); // 간략한 표현 new Thread(() => Run()).Start(); } static void Run() { Console.WriteLine("Run"); } }
C# 쓰레스 생성 예 - 다른 클래스 메서드 동일 클래스가 아닌 다른 클래스의 메서드를 쓰레드에 호출하기 위해서는 해당 클래스의 객체를 생성한 후 (혹은 외부로부터 전달 받은 후) 그 객체의 메서드를 델리게이트로 Thread에 전달하면 된다. 예제
class Helper { public void Run() { Console.WriteLine("Helper.Run"); } } class Program { static void Main(string[] args) { // Helper클래스의 Run메서드 호출 Helper obj = new Helper(); Thread t = new Thread(obj.Run); t.Start(); } }
C# 동영상 강의 : C# 접근 제한자 (Access Modifier) 의 개념과 사용법 [레벨] 중급 [C# 중급] C# 에서 사용하는 접근 제한자 (Access Modifier) 의 개념과 private, public, internal, protected 를 언제, 어떻게 사용하는지에 대해 자세히 설명합니다. |
본 웹사이트는 광고를 포함하고 있습니다. 광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다. 이전 코멘트 모두 보기
 | antiprotct@*** | 11/15/2017 12:09:09 AM |
| 답변 감사합니다. 실제로 업무에 사용할때는 위와 같은 형태로 사용하는것은 스레드 컨트롤이 안되니 위험할 수 있겠네요 |
 | 1012yhs@*** | 11/20/2017 6:44:57 AM |
| 안녕하세요. 현재 윈도우 폼 타이머를 사용해서 UI 에 1초마다 시계를 나타내주고 있고 쓰레딩 쓰레드를 사용해서 NAudio dll을 통해 mp3를 틀고 있는데 문제는 UI에서 돌고 있는 timer 때문에 mp3소리가 딱딱 끊겨서 들립니다 이 문제를 어떻게 해결하면 좋을까요... 일단 임시방편으로 mp3를 틀 때 Ui timer를 정지시키고 들고 있는데 그렇게 하면 당연히 ui에서 음악이 끝날 때까지 시계가 업데이트 되지 않습니다. 저는 동시에 돌리고 싶은데 어떻게 하면 좋을까요? |
 | admin@*** | 11/20/2017 7:59:15 PM |
| @1012yhs: 혹시 mp3가 UI 쓰레드에서 돌고 있는 거 아닌가요? 백그라운드 쓰레드에서 돌고 있다면, 서로 interrupt를 안 할텐데요.. |
 | shjolk@*** | 1/6/2019 6:00:49 AM |
| 안녕하세요~ 선생님~ static void Main(string[] args) 안에서 } new Program().DoTest(); //이렇게 쓰셨는데, } -------------- static void Main(string[] args) { DoTest(); // 이렇게 쓰는 것과 차이점이 무엇인가요? } |
 | admin@*** | 1/6/2019 3:26:01 PM |
| @shjolk: Main() 메서드가 static 메서드이기 때문에 DoTest()가 static void DoTest() 와 같이 static 메서드로 정의되면, DoTest();와 같이 직접 호출할 수 있습니다. 위 예제는 void DoTest() 와 같이 static 메서드가 아니라 인스턴스 메서드이기 때문에 new Program().DoTest(); 와 같이 먼저 객체를 생성해서 호출하는 것입니다. |
"예제로 배우는" 시리즈 - 예제로 배우는 Python
- 예제로 배우는 GO 프로그래밍
- 예제로 배우는 SQL 프로그래밍
- 예제로 배우는 Rust
- Crypto 스터디 (암호학/암호화폐)

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