【问题标题】:Syntax for launching many async tasks in c#在 C# 中启动许多异步任务的语法
【发布时间】:2014-05-02 10:43:56
【问题描述】:

我在使用 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 ...]
}

我有 1 个问题,当我尝试运行它时,我在 Start() 上收到一个 InvalidOperationException 错误消息“Start may not be called on a promise-style task.” 这个Google 或 Bing 中似乎没有出现错误消息,所以我不确定它是什么意思。这是我的第一个问题,如何让它运行。我也尝试过 TaskFactory.StartNew() 但不明白如何以这种方式将参数传递给我的方法。

【问题讨论】:

  • 尽管我认为该行根本不应该存在,但您可以通过不从字典中提取已经引用的内容来节省一些时间......因为这样的myTasks[IdsLeftToProcess].Start(); 最好用t.Start() 表示(如果首先有必要的话)

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


【解决方案1】:

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

引用Stephen Toub's Async/Await FAQ:

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

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

【讨论】:

  • @Jonathon Reinhart - 添加了参考,感谢您指出
  • 很容易错过像这些信息这样的小花絮。感谢您的帮助。
【解决方案2】:

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

【讨论】:

  • 实际上,您无法启动它们。
  • 这不是问题的全部内容吗?
  • 您说您不需要启动它们,这意味着您可以根据需要启动它们。但事实并非如此。
  • 因此,InvalidOperationException :)
  • 我在模拟“异步”方法的响应时遇到了这个问题。因为我返回的任务是冷的,但实际异步方法创建的任务是热的。
猜你喜欢
  • 2019-12-20
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
  • 2017-09-30
  • 1970-01-01
相关资源
最近更新 更多