2012-06-27 4 views
15

C#에서 새로운 비동기/대기 도구 사용에 문제가 있습니다. 여기 내 시나리오 :이 실행하려고 할 때 그 1 문제가C#에서 많은 비동기 작업을 시작하는 구문

static async Task<bool> ManageSomeRemoteTask(int Id, bool flag) 
{ 
    var result = await serviceClient.AuthenticateIdAsync(Id); 
    [... Setup Some Data ...] 
    await serviceClient.LongAndSlowRemoteCallAsync(Data); 
} 

static void SendATonOfJunkToSomeWebServiceThatDoesntSupportBatches 
{ 
    var myTasks = Dictionary<int, Task<bool>>(); 
    while(IdsLeftToProcess > 0) 
    { 
     Task<bool> t = ManageSomeRemoteTask(Id, true); 
     myTasks.Add(IdsLeftToProcess ,t); 
     myTasks[IdsLeftToProcess].Start(); 
     IdsLeftToProcess --; 
    } 

    Task.WaitAll(myTasks.Values.ToArray()); //Wait until they are all done 
    [... Report statistics ...] 
} 

, 나는 오류 메시지와 함께() 시작에 InvalidOperationException이 얻을 " 시작은 약속 스타일의 작업에 호출 할 수 없습니다 . "이 오류 메시지는 Google 또는 Bing에서 나오지 않아서 의미가 확실하지 않습니다. 이것이 나의 가장 큰 관심사인데, 이것이 실행되도록하는 방법입니다. TaskFactory.StartNew()를 시도했지만 매개 변수를 내 메서드에 전달하는 방법을 이해하지 못했습니다.

+1

라인이 전혀 없을 것을, 당신이 뭔가를 잡아 당겨하지 않음으로써 약간의 시간을 절약 할 거라고 이미 같은 ... 사전 아웃에 대한 참조를 가지고 'myTasks [IdsLeftToProcess] .Start();'는 t.Start()에 의해 더 잘 표현되었을 것이다. (처음에 필요하다면) – spender

답변

26

비동기 메소드에서 반환하는 작업은 항상 입니다. 즉입니다. 즉, 실행 중 상태로 생성됩니다. task.Start()를 코드에서 제거하십시오. 코드를 수정해야합니다.

Stephen Toub's Async/Await FAQ에서 인용

:

나는 방법에 의해 생성 된 "시작"작업이 "비동기"로 표시해야합니까?

아니요. TAP 메소드에서 반환되는 작업은 "핫"입니다. 즉, 작업이 이미 진행중인 작업을 나타냅니다. 이러한 작업에서는 ".Start()"를 호출 할 필요가 없을뿐만 아니라 시도 할 경우 실패합니다. 자세한 내용은 Task.Start의 FAQ를 참조하십시오. 제 생각에도 불구하고

+0

설명서 참조? –

+1

@Jonathon Reinhart - 참조를 추가했습니다. – alexm

+0

을 지적 해 주셔서 감사합니다. 그 정보와 같이 작은 비트를 놓치기 쉽습니다. 도와 주셔서 감사합니다. – Jason

9

async 메서드 호출에서 반환 한 작업을 시작할 필요가 없습니다. 기본적으로 시작됩니다.

+3

사실, * 시작할 수 없다. – svick

+1

그게 무슨 문제가되지 않습니까? – spender

+3

당신은 당신이 원한다면 당신이 할 수있는 것을 의미 당신이 그들을 시작할 필요가 없다고 말했다. 그러나 그것은 사실이 아닙니다. – svick