如何从非异步方法调用并行中的异步方法?我还需要捕获异常并将它们记录在调用方法中。从非异步方法在并行中运行异步方法
下面的实现工作,但我读过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);
}
}
*如何从非异步方法调用并行方式的异步方法?*是否有任何理由试图做到这一点?我假设你不能改变调用方法? –
为什么不将'Tasks.WaitAll(tasks.ToArray())'包装在try/catch块中,我认为这是有效的。 – DavidG
恕我直言,我会建议donot混合同步和异步代码 – Eldho