C# Thread 클래스 파라미터 전달
Thread 클래스는 파라미터를 전달하지 않는 ThreadStart 델리게이트와 파라미터를 직접 전달하는 ParameterizedThreadStart 델리게이트를 사용할 수 있다. ThreadStart 델리게이트는 public delegate void ThreadStart(); 프로토타입에서 알 수 있듯이, 파라미터를 직접 전달 받지 않는다. ( 물론 파라미터를 전달하는 방식은 있다. ) ParameterizedThreadStart 델리게이트는 public delegate void ParameterizedThreadStart(obejct obj); 로 정의 되어 있는데, 하나의 object파라미터를 전달하고 리턴 값이 없는 형식이다. 하나의 파라미터를 object형식으로 전달하기 때문에, 여러 개의 파라미터를 전달하기 위해서는 클래스나 구조체를 만들어 객체를 생성해서 전달할 수 있다. 파라미터의 전달은 Thread.Start() 메서드를 호출할 때 파라미터를 전달한다.
ThreadStart를 이용해 파라미터를 전달하는 방법은 일단 델리게이트 메서드는 파라미터를 받아들이지 않으므로 그 메서드 안에서 다른 메서드를 호출하면서 파라미터를 전달하는 방식을 사용할 수 있다. 이렇게 하면 파라미터를 아래 t3의 예처럼 여러 개 전달할 수도 있다.
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 |
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace csharp_study
{
class Program
{
static void Main(string[] args)
{
Thread t1 = new Thread(new ThreadStart(Run));
t1.Start();
Thread t2 = new Thread(new ParameterizedThreadStart(Calc));
t2.Start(10.00);
Thread t3 = new Thread(() => Sum(10, 20, 30));
t3.Start();
}
static void Run()
{
Console.WriteLine("running");
}
static void Calc(object radius)
{
double r = (double)radius;
double area = r * r * 3.14;
Console.WriteLine("r={0}, area = {1}", r, area);
}
static void Sum(int d1,int d2, int d3)
{
int sum = d1 + d2 + d3;
Console.WriteLine(sum);
}
}
}
|
cs |
Background 쓰레드 vs Foreground 쓰레드
Thread 클래스 객체를 생성한 후 Start()를 실행하기 전에 IsBackground 속성을 true/false로 지정할 수 있는데, 만약 true로 지정하면 이 쓰레드는 백그라운드 쓰레듣가 된다. 디폴트 값을 false 즉 Foreground 쓰레드이다. 백그라운드와 Foreground 쓰레드의 기본적인 차이점은 Foreground 쓰레드는 메인 쓰레드가 종료되더라도 Forground 쓰레드가 살아 있는 한 프로세스가 종료되지 않고 계속 실행되고, 백그라운드는 메인 쓰레드가 종료되면 바로 프로세스를 종료한다는 점이다.
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 |
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
namespace csharp_study
{
class Program
{
static void Main(string[] args)
{
//forground
Thread t1 = new Thread(new ThreadStart(Run));
t1.Start();
//background
Thread t2 = new Thread(new ParameterizedThreadStart(Calc));
t2.IsBackground = true;
t2.Start(10.00);
}
static void Run()
{
Console.WriteLine("running");
}
static void Calc(object radius)
{
double r = (double)radius;
double area = r * r * 3.14;
Console.WriteLine("r={0}, area = {1}", r, area);
}
}
}
|
cs |
'프로그래밍 > C#' 카테고리의 다른 글
c# ThreadPool 사용 (0) | 2017.06.26 |
---|---|
C# Mutex 동기화 코드 (0) | 2017.06.21 |
C# Thread 클래스 (0) | 2017.06.20 |
C# 익명타입 : 클래스를 미리 정의하지 않고 사용하는 것. (0) | 2017.06.16 |
C# => Lambda Expression : 무명 함수를 표현하는데 사용 주로 Linq에서 많이 사용 (0) | 2017.06.16 |
댓글