2012-06-27 8 views
15

C#で新しいasync/awaitツールを使用する際に問題があります。ここに私のシナリオです:私はこれを実行しようとすると、私はその中の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

関連する問題