Синтаксис для запуска многих задач async в С#
У меня возникли проблемы с использованием новых инструментов async/wait в С#. Вот мой сценарий:
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 проблема в том, что, когда я пытаюсь запустить это, я получаю InvalidOperationException в Start() с сообщением об ошибке "" Пуск "не может быть вызван в задачу в стиле обеда." сообщение об ошибке, похоже, не появляется в Google или Bing, поэтому я не уверен, что это значит. Это моя проблема номер один, как заставить это работать. Я также попробовал TaskFactory.StartNew(), но не понял, как передать параметры моему методу таким образом.
Ответы
Ответ 1
Задачи, возвращаемые асинхронными методами, всегда горячие, т.е. они создаются в состоянии "Запуск". Попробуйте удалить task.Start() из вашего кода - он должен исправить его.
Цитата из Часто задаваемые вопросы по Stephen Toub Async/Await:
Нужно ли мне запускать задачи, созданные методами, помеченными как "async"?
Нет. Задачи, возвращаемые с помощью методов TAP, являются "горячими", то есть задачи представляют собой операции, которые уже выполняются. Вам не только не нужно называть ".Start()" на таких задачах, но при попытке выполнить это не удастся. Дополнительные сведения см. В разделе "Вопросы и ответы" на странице "Задача".
Ответ 2
Вам не нужно запускать задачи, возвращаемые вызовами асинхронного метода. Они запускаются по умолчанию.