C# - Task (1)

One·2021년 9월 26일
1

C#

목록 보기
1/3

Task 생성과 실행

Task.Factory.StartNew를 이용하여 생성 및 실행

    Task.Factory.StartNew(() => {
    		int i = 1000;
    	  while (i-- > 0) {
    	      Console.Write('-');
    	  }
    });

Task.Factory.StartNew()는 Task를 생성하고 자동으로 실행시킨다.

Task 인스턴스를 생성하고 Task.Start로 실행

    Task t = new Task(() => {
    		int i = 1000;
    	  while (i-- > 0) {
    		    Console.Write('?');
    	  }
    });

    t.Start(); // Task는 자동으로 실행되지 않는다

위의 경우 Task를 자동으로 실행시키지 않는다. 따라서 Task.Start() 함수를 사용하여 Task를 실행시킨다.

Task.Factory.StartNew 와 Task 생성자의 매개 변수로는 델리게이트(delegate), 람다식(lamda), 무명 메소드(anonymous method)를 사용할 수 있다.

Task는 object 매개변수를 가질 수 있다.

public static void Write(object s) {
    int i = 1000;
    while (i-- > 0) {
        Console.Write(s.ToString());
    }
}

private static void TasksWithState() {
    Task t = new Task(Write, "foo");
    t.Start();
    Task.Factory.StartNew(Write, "bar");
}

new Task(x => { foo(x) }, arg) 또는 Task.Factory.StartNew(x => { foo(x) }, arg) 처럼 두번째 매개변수에 object 변수를 받아서 사용할 수 있다.

값을 리턴하기 위해 Task<T>를 사용하고 Task.Return으로 리턴 값을 가져올 수 있다.

private static void TasksWithReturnValues() {
    string text1 = "testing", text2 = "this";
    var task1 = new Task<int>(TextLength, text1);
    task1.Start();
    var task2 = Task.Factory.StartNew(TextLength, text2);
    Console.WriteLine($"Length of '{text1}' is {task1.Result}.");
    Console.WriteLine($"Length of '{text2}' is {task2.Result}.");
}

Task.Result를 사용하면 Task가 끝날 때까지 기다린다.

각각의 Task를 확인하기 위해 Task.CurrentId를 사용한다.

public static int TextLength(object o) {
	Console.WriteLine($"\nTask with id {Task.CurrentId} processing object '{o}'...");
	return o.ToString().Length;
}
profile
Unity Developer

0개의 댓글