Task.Start와 Task.Run 는 둘다 비 동기 작업을 시작하는데 사용되는 메소드이다
Task.Start 메소드
public void Start ();
public void Start (System.Threading.Tasks.TaskScheduler scheduler);
Task.Start 는 새로운 Task 인스턴스를 생성하고 시작하는데 사용된다
기본적으로 TaskScheduler.Current 에서 실행된다
주로 커스텀 스케줄링 로직을 사용하거나 특정 스레드에서 작업을 실행 하려는 경우 사용된다
Task.Factory.StartNew 와 유사한 동작을 한다
Task 생성자를 호출해서 현재 작업을 시작하고 스케줄러에 대한 실행을 예약한다
using System;
using System.Threading;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
var t = new Task( () => {
// 비동기 또는 CPU-bound 작업 실행
Console.WriteLine("Task {0} running on thread {1}",
Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
for (int ctr = 1; ctr <= 10; ctr++)
Console.WriteLine(" Iteration {0}", ctr); }
);
t.Start();
t.Wait();
}
}
Task.Run() 메서드
Task.Run() 주어진 작업을 TaskScheduler.Default 에서 실행하는데 사용되고
CPU-Bound 나 비동기 작업을 포함하는 메서드를 호출할 때 사용한다
지정한 작업을 ThreadPool에서 실행하도록 큐에 대기시키고 해당 작업에 대한 작업 또는 Task<TResult> 핸들을 반환한다
Task.Run() 안에 비동기적으로 실행할 작업을 넣어 사용이 가능하다
using System;
using System.Threading;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
ShowThreadInfo("Application");
var t = Task.Run(() => ShowThreadInfo("Task") );
t.Wait();
}
static void ShowThreadInfo(String s)
{
Console.WriteLine("{0} thread ID: {1}",
s, Thread.CurrentThread.ManagedThreadId);
}
}
// The example displays the following output:
// Application thread ID: 1
// Task thread ID: 3
using System;
using System.Threading;
using System.Threading.Tasks;
public class Example
{
public static void Main()
{
Console.WriteLine("Application thread ID: {0}",
Thread.CurrentThread.ManagedThreadId);
var t = Task.Run(() => { Console.WriteLine("Task thread ID: {0}",
Thread.CurrentThread.ManagedThreadId);
} );
t.Wait();
}
}
// The example displays the following output:
// Application thread ID: 1
// Task thread ID: 3
주요 차이점은 Task.Run이 일반적으로 기본 스레드 풀을 사용하여 작업을 실행하는 반면,
Task.Start는 생성된 Task 인스턴스의 실행을 시작하고 현재 스레드 컨텍스트에 따라 실행 할 수 있다
대부분의 경우 Task.Run을 사용하여 작업을 실행하는 것이 더 편리하고 명시적이다