2013-06-08 2 views
22

AWAIT하여 이들 두 형태 사이의 기능적 차이가는 Task.Factory.StartNew (() => Task.Start 대 기다리고

  1. string x = await Task.Factory.StartNew(() => GetAnimal("feline")); 
    
  2. Task<string> myTask = new Task<string>(() => GetAnimal("feline")); 
    myTask.Start(); 
    string z = await myTask; 
    
?

각 작업이 1에서 어떤 순서로 호출됩니까? StartNew가 호출 된 후 호출되기를 기다리거나 1에서 1이 먼저 호출되기를 기다리고 있습니까?

답변

14

StartNew은 단지 short hand for creating and starting a task입니다. 시작하기 전에 Task 인스턴스에 대해 작업을 수행하려면 생성자를 사용하십시오. 작업을 즉시 만들고 시작하려면 짧은 손을 사용하십시오. StartNew를 호출하면 실행을 위해 작업을 예약 할 수 Task.Start 방법 를 호출하는 다음의 생성자 중 하나를 사용 하여 작업을 생성하고, 기능적으로 동일

: StartNew에 대한

문서는 말한다.

+0

myTask.Start()를 호출하면 GetAnimal ("feline")이 즉시 호출됩니다. 이는 작업을 시작했기 때문에 의미가 있습니다. 즉, 즉시 여러 작업을 시작할 수 있으며 나중에 각 작업에 대한 대기 시간을 결정할 수 있습니까? – user42

+0

@ user42 : 물론. (하지만 다른 스레드에서 호출하는 것이 완전히 "즉시"라고 말하지는 않습니다.) – Vlad

-8

차이는 없습니다. 그들은 정확히 같은 일리노이 코드를 산출합니다.

+0

차이는 없지만 정확히 동일한 IL을 생성하지는 않습니다. – vcsjones

+5

그건 그냥 잘못입니다. 하나는 IL이'Task.get_Factory'를 호출 한 다음'TaskFactory.StartNew'를 호출하고 다른 하나는'Task '의 생성자를 호출 한 다음'Task.Start()'를 호출합니다. – svick

24

코드를 asyncawait으로 작성하는 경우 가능한 경우 Task.Run을 사용해야합니다.

Task 생성자 (및 Task.Start)는 아직 시작되지 않은 작업을 만드는 데 사용되는 작업 병렬 라이브러리에서 유지됩니다. Task 생성자와 Task.Startasync 코드에 사용하면 안됩니다.

마찬가지로 TaskFactory.StartNewasync 작업에 가장 적합한 기본값을 사용하지 않고 async 람다를 이해하지 못하는 이전 방법입니다. 그것은 약간 상황에서 유용 할 수있다, 그러나 시간의 대다수는 Task.Runasync 부호를 위해 더 낫다.

+0

이 더 좋은 방법입니까? ...}'대리자 문자열 AnimalDelegate (string t);'AnimalDelegate a = 새 AnimalDelegate (GetAnimal);''var result = Task.Run (() => {return a ("feline");});' – user42

+6

당신은 단지'var result = await Task.Run (() => GetAnimal ("feline"))이라고 말할 수 있습니다. –

관련 문제