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. ” 这个错误消息似乎没有出现谷歌或必应所以我不确定它是什么意思。这是我的第一个问题,如何让它运行。我也尝试过 TaskFactory.StartNew() 但不明白如何以这种方式将参数传递给我的方法。

4

2 回答 2

27

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

引用Stephen Toub 的 Async/Await 常见问题解答

我是否需要“启动”由标记为“异步”的方法创建的任务?

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

于 2012-06-27T23:11:27.290 回答
9

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

于 2012-06-27T23:09:41.567 回答