Как вызвать методы async в paralell из метода non async? Мне также нужно ловить исключения, записывая их в вызывающий метод.Запуск методов async в paralell из метода non async
Выполнение ниже работает, но я прочитал, что WaitAny не рекомендуется, но я не смог заставить его работать, например, WhenAll.
Ps, «реальные» методы асинхронизации в моем приложении могут занять довольно много времени, около 10 минут.
class AsyncTest
{
public void RunAsyncInParalell()
{
var tasks = new List<Task>();
var count = 500;
for(var i=0; i<count;i++)
{
tasks.Add(AsyncMethod(i));
}
while (tasks.Count() > 0)
{
var index = Task.WaitAny(tasks.ToArray());
try
{
var res = tasks[index].Exception;
if (res != null)
{
res.Flatten();
foreach (Exception ex in res.InnerExceptions)
{
Debug.WriteLine("ERROR: "+ ex.Message, ex);
}
}
}
catch (AggregateException aex)
{
aex = aex.Flatten();
foreach (Exception ex in aex.InnerExceptions)
{
Debug.WriteLine("ERROR: " + ex.Message, ex);
}
}
catch (Exception ex)
{
Debug.WriteLine("ERROR: " + ex.Message, ex);
}
tasks.RemoveAt(index);
}
}
public async Task<int> AsyncMethod(int i)
{
var rnd = new Random(DateTime.Now.Millisecond);
int ticks = rnd.Next(0, 5000);
if (i == 50)
{
throw new Exception("Exception thrown for i=" + i);
}
await Task.Delay(ticks);
return (i);
}
}
* Как я могу вызвать методы асинхронизации в paralell из неасинхронного метода? * Есть ли причина, по которой вы пытаетесь это сделать? Я предполагаю, что вы не можете изменить метод вызова? –
Почему бы не включить 'Tasks.WaitAll (tasks.ToArray())' в блок try/catch, я думаю, что это работает. – DavidG
IMHO Я бы предложил donot mix синхронизировать и асинхронный код – Eldho