15

C# で新しい async/await ツールを使用する際に問題があります。これが私のシナリオです:

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 ...]
}

これを実行しようとすると、Start() で InvalidOperationException が発生し、「Start may not be called on a promise-style task.」というエラー メッセージが表示されるという問題が 1 つあります。 GoogleまたはBingなので、それが何を意味するのかわかりません。これが私の最大の関心事です。これを実行する方法です。TaskFactory.StartNew() も試しましたが、メソッドにパラメーターを渡す方法がわかりませんでした。

4

2 に答える 2

27

非同期メソッドによって返されるタスクは常にホットです。つまり、実行中の状態で作成されます。コードから task.Start() を削除してみてください-修正する必要があります。

Stephen Toub の Async/Await FAQからの引用:

「非同期」とマークされたメソッドによって作成されたタスクを「開始」する必要がありますか?

いいえ。TAP メソッドから返されるタスクは「ホット」です。つまり、タスクは既に進行中の操作を表します。そのようなタスクで「.Start()」を呼び出す必要がないだけでなく、実行しようとすると失敗します。詳細については、Task.Start に関する FAQ を参照してください。

于 2012-06-27T23:11:27.290 に答える
9

非同期メソッド呼び出しによって返されるタスクを開始する必要はありません。これらはデフォルトで開始されています。

于 2012-06-27T23:09:41.567 に答える