我在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()但是不明白如何将参数传递给我的方法。
答案 0 :(得分:27)
异步方法返回的任务始终是 hot ,即它们是在Running状态下创建的。尝试从代码中删除task.Start() - 它应该修复它。
来自Stephen Toub's Async/Await FAQ的引用:
我是否需要“开始”由标记为“async”的方法创建的任务?
没有。从TAP方法返回的任务是“热门”,这意味着任务代表已在进行中的操作。您不仅不需要在此类任务上调用“.Start()”,但如果您尝试这样做,则会失败。有关更多详细信息,请参阅Task.Start上的常见问题解答。
答案 1 :(得分:9)
您无需启动异步方法调用返回的任务。它们默认启动。