在c#中启动许多异步任务的语法

时间:2012-06-27 23:07:39

标签: c# task-parallel-library async-await

我在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可能不会在promise风格的任务上调用。”这个Google或Bing似乎没有出现错误消息,所以我不确定这意味着什么。这是我的头号问题,如何让它运行。我也试过TaskFactory.StartNew()但是不明白如何将参数传递给我的方法。

2 个答案:

答案 0 :(得分:27)

异步方法返回的任务始终是 hot ,即它们是在Running状态下创建的。尝试从代码中删除task.Start() - 它应该修复它。

来自Stephen Toub's Async/Await FAQ的引用:

  

我是否需要“开始”由标记为“async”的方法创建的任务?

     
    

没有。从TAP方法返回的任务是“热门”,这意味着任务代表已在进行中的操作。您不仅不需要在此类任务上调用“.Start()”,但如果您尝试这样做,则会失败。有关更多详细信息,请参阅Task.Start上的常见问题解答。

  

答案 1 :(得分:9)

您无需启动异步方法调用返回的任务。它们默认启动。