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

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

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

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

最佳答案

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

引自 Stephen Toub's Async/Await FAQ :

Do I need to “Start” Tasks created by methods marked as “async”?

No. Tasks returned from TAP methods are “hot”, meaning the tasks represent operations that are already in-progress. Not only do you not need to call “.Start()” on such tasks, but doing so will fail if you try. For more details, see FAQ on Task.Start.

关于c# - 在 C# 中启动许多异步任务的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11236009/

相关文章:

c# - 从同步代码调用异步方法并阻塞直到任务完成的正确方法是什么?

c# - 结合应用程序域远程处理和任务时出现死锁

javascript - 尝试循环 axios 请求并异步推送

c# - 如何通过两种不同类型的字段对 linq 查询结果进行排序

c# - 使用 Isolated COM 时应用程序在 CoCreateInstance 期间挂起

c# - Asp.Net MVC 5 - 长时间运行的任务 - 如何确保 IIS 回收 AppPool 时工作线程不会被丢弃?

python - 如何获取页面的所有链接?

.net - .net核心中是否有DBSet.UpdateAsync()和RemoveAsync()?

c#什么时候编程到接口(interface)?

c# - 在 VSTO 和 WPF 应用程序中未调用 SystemEvents.PowerModeChanged 事件处理程序