Task.Factory.StartNew(() => {
int i = 1000;
while (i-- > 0) {
Console.Write('-');
}
});
Task.Factory.StartNew()는 Task를 생성하고 자동으로 실행시킨다.
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)를 사용할 수 있다.
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 변수를 받아서 사용할 수 있다.
<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가 끝날 때까지 기다린다.
public static int TextLength(object o) {
Console.WriteLine($"\nTask with id {Task.CurrentId} processing object '{o}'...");
return o.ToString().Length;
}