C# 从非异步方法并行运行异步方法
如何从非异步方法并行调用异步方法?我还需要捕获异常并将其记录在调用方法中 下面的实现是可行的,但我已经了解到不推荐使用WaitAny,但我无法使它与例如WhenAll一起工作 另外,我的应用程序中的“真正”异步方法可能需要相当长的时间才能完成,大约10分钟C# 从非异步方法并行运行异步方法,c#,asynchronous,async-await,C#,Asynchronous,Async Await,如何从非异步方法并行调用异步方法?我还需要捕获异常并将其记录在调用方法中 下面的实现是可行的,但我已经了解到不推荐使用WaitAny,但我无法使它与例如WhenAll一起工作 另外,我的应用程序中的“真正”异步方法可能需要相当长的时间才能完成,大约10分钟 class AsyncTest { public void RunAsyncInParalell() { var tasks = new List<Task>(); var count
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);
}
}
类异步测试
{
public void runAsyncinParallel()
{
var tasks=新列表();
var计数=500;
对于(变量i=0;i 0)
{
var index=Task.WaitAny(tasks.ToArray());
尝试
{
var res=任务[index]。异常;
如果(res!=null)
{
res.flatte();
foreach(res.InnerExceptions中的异常ex)
{
Debug.WriteLine(“错误:+ex.消息,ex”);
}
}
}
捕获(聚合异常aex)
{
aex=aex.flatte();
foreach(aex.InnerExceptions中的异常ex)
{
Debug.WriteLine(“错误:+ex.消息,ex”);
}
}
捕获(例外情况除外)
{
Debug.WriteLine(“错误:+ex.消息,ex”);
}
任务。删除(索引);
}
}
公共异步任务异步方法(int i)
{
var rnd=新随机(DateTime.Now.毫秒);
int ticks=rnd.Next(0,5000);
如果(i==50)
{
抛出新异常(“为i=“+i”抛出异常);
}
等待任务。延迟(滴答声);
回报(i);
}
}
如果要同步等待所有任务完成,请注意上下文:对每个等待的任务使用ConfigureAwait(false)
,或在不包含上下文的线程上等待
你可以使用这个方法
如果要同步等待所有任务完成,请注意上下文:在每个等待的任务上使用
ConfigureAwait(false)
,或者在不包含上下文的线程上使用wait
你可以使用这个方法
如果要同步等待所有任务完成,请注意上下文:在每个等待的任务上使用
ConfigureAwait(false)
,或者在不包含上下文的线程上使用wait
你可以使用这个方法
如果要同步等待所有任务完成,请注意上下文:在每个等待的任务上使用
ConfigureAwait(false)
,或者在不包含上下文的线程上使用wait
你可以使用这个方法
如何从非异步方法并行调用异步方法
最好的答案是“你没有”。但是,您可以从另一个异步方法并发调用异步方法:
公共异步任务RunAsync()
{
var tasks=新列表();
var计数=500;
对于(变量i=0;i
调用RunAsync
的正确方法是使用wait
。如果无法使调用代码异步,请首先查看我在上的博客系列。如果仍然无法使调用代码异步,请查看我的MSDN brownfield async文章中的各种代码
如何从非异步方法并行调用异步方法
最好的答案是“你没有”。但是,您可以从另一个异步方法并发调用异步方法:
公共异步任务RunAsync()
{
var tasks=新列表();
var计数=500;
对于(变量i=0;i
调用RunAsync
的正确方法是使用wait
。如果无法使调用代码异步,请首先查看我在上的博客系列。如果仍然无法使调用代码异步,请查看我的MSDN brownfield async文章中的各种代码
如何从非异步方法并行调用异步方法
最好的答案是“你没有”。但是,您可以从另一个异步方法并发调用异步方法:
公共异步任务RunAsync()
{
var tasks=新列表();
var计数=500;
对于(变量i=0;i
调用RunAsync
的正确方法是使用wait
。如果无法使调用代码异步,请首先查看我在上的博客系列。如果仍然无法使调用代码异步,请查看我的MSDN brownfield async文章中的各种代码
如何从非异步方法并行调用异步方法
最好的答案是“你没有”。但是,您可以从另一个异步方法并发调用异步方法:
公共异步任务RunAsync()
{
var tasks=新列表();
var计数=500;
对于(变量i=0;iTask.WaitAll(tasks.ToArray());
// Then iterate over tasks to get results
public async Task RunAsync()
{
var tasks = new List<Task>();
var count = 500;
for (var i = 0; i < count; ++i)
tasks.Add(CallMethodAsync(i));
await Task.WhenAll(tasks);
}
private async Task CallMethodAsync(int i)
{
try
{
await AsyncMethod(i);
}
catch (Exception ex)
{
Debug.WriteLine("ERROR: "+ ex.Message, ex);
throw; // TODO: Decide if this is the behavior you want.
}
}