如何從非異步方法調用並行中的異步方法?我還需要捕獲異常並將它們記錄在調用方法中。從非異步方法在並行中運行異步方法
下面的實現工作,但我讀過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