동일한 작업을 수행하는 TPL 사용에 관한 3 가지 루틴을 보았습니다. 코드는 다음과 같습니다.
public static void Main()
{
Thread.CurrentThread.Name = "Main";
// Create a task and supply a user delegate by using a lambda expression.
Task taskA = new Task( () => Console.WriteLine("Hello from taskA."));
// Start the task.
taskA.Start();
// Output a message from the calling thread.
Console.WriteLine("Hello from thread '{0}'.",
Thread.CurrentThread.Name);
taskA.Wait();
}
public static void Main()
{
Thread.CurrentThread.Name = "Main";
// Define and run the task.
Task taskA = Task.Run( () => Console.WriteLine("Hello from taskA."));
// Output a message from the calling thread.
Console.WriteLine("Hello from thread '{0}'.",
Thread.CurrentThread.Name);
taskA.Wait();
}
public static void Main()
{
Thread.CurrentThread.Name = "Main";
// Better: Create and start the task in one operation.
Task taskA = Task.Factory.StartNew(() => Console.WriteLine("Hello from taskA."));
// Output a message from the calling thread.
Console.WriteLine("Hello from thread '{0}'.",
Thread.CurrentThread.Name);
taskA.Wait();
}
난 그냥 MS가 같은 TPL 그들은 때문에 모든 작업을 작업을 실행하는 3 개 가지 방법을 제공합니다 이유를 이해하지 않습니다 Task.Start()
, Task.Run()
그리고 Task.Factory.StartNew()
.
내게된다 텔 Task.Start()
, Task.Run()
그리고 Task.Factory.StartNew()
모두 같은 목적으로 사용하거나 서로 다른 의미를 가지고 있습니까?
때 하나 개 사용한다 Task.Start()
, 때 하나를 사용해야 Task.Run()
언제해야 하나 개 사용을 Task.Factory.StartNew()
?
예를 들어 시나리오별로 실제 사용법을 자세히 이해하도록 도와주십시오. 감사합니다.
답변
Task.Run
Task.Factory.StartNew
특정 안전 인수 를 사용 하는 축약 형입니다 .
Task.Factory.StartNew(
action,
CancellationToken.None,
TaskCreationOptions.DenyChildAttach,
TaskScheduler.Default);
.Net 4.5에 추가되어 점차 빈번하게 사용 async
및 오프로드 작업을 수행 할 수 ThreadPool
있습니다.
Task.Factory.StartNew
(.Net 4.0에서 TPL과 함께 추가됨)이 훨씬 강력합니다. Task.Run
충분하지 않은 경우 , 예를 들어 사용하고 싶을 때만 사용해야합니다 TaskCreationOptions.LongRunning
(대리자가 비동기 일 때는 불필요합니다. 내 블로그에 대한 자세한 내용 : LongRunning은 쓸모없는 Task.Run with async-await ). Task.Run vs Task.Factory.StartNewTask.Factory.StartNew
에서 자세히 알아보기
그렇게 할만한 타당한 이유가없는 한 Task
, 전화를 걸지 Start()
마십시오. 작업을 작성해야하지만 일부는 작성하지 않고 일정을 설정하지 않아도되는 일부 부품이있는 경우에만 사용해야합니다. 그것은 거의 적절한 해결책이 아니며 위험 할 수 있습니다. 더 많은 대 “Task.Factory.StartNew” “새 작업 (…). 시작”
결론적으로, 대부분 사용하고 Task.Run
, 사용 Task.Factory.StartNew
하지 않으면 안됩니다 Start
.
답변
짧은 답변 :
중첩 된 하위 작업을 사용하지 않고 항상 스레드 풀 에서 작업을 실행 하려면을 사용하는 것이 좋습니다 Task.Run
.
긴 대답 :
Task.Run
그리고 Task.Factory.StartNew
모두 작성에 대한 지원을 제공하고, 우리가 만들 필요가 없습니다 스케줄링 작업은 객체 Task
와 전화를Start()
Task.Run(action);
다음과 같습니다.
Task.Factory.StartNew(action, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);
과
Task.Factory.StartNew(action);
다음과 같습니다.
Task.Factory.StartNew(action, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.Current);
Task.Run
사용 TaskCreationOptions.DenyChildAttach
은 하위 태스크를 상위에 첨부 할 수 없음 TaskScheduler.Default
을 의미하며 스레드 풀에서 태스크를 실행하는 태스크는 항상 태스크를 실행하는 데 사용됩니다.
Task.Factory.StartNew
를 사용 TaskScheduler.Current
하여 현재 스레드의 스케줄러를 의미 TaskScheduler.Default
하지만 항상 그런 것은 아닙니다.