Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从非异步方法并行运行异步方法_C#_Asynchronous_Async Await - Fatal编程技术网

C# 从非异步方法并行运行异步方法

C# 从非异步方法并行运行异步方法,c#,asynchronous,async-await,C#,Asynchronous,Async Await,如何从非异步方法并行调用异步方法?我还需要捕获异常并将其记录在调用方法中 下面的实现是可行的,但我已经了解到不推荐使用WaitAny,但我无法使它与例如WhenAll一起工作 另外,我的应用程序中的“真正”异步方法可能需要相当长的时间才能完成,大约10分钟 class AsyncTest { public void RunAsyncInParalell() { var tasks = new List<Task>(); var count

如何从非异步方法并行调用异步方法?我还需要捕获异常并将其记录在调用方法中

下面的实现是可行的,但我已经了解到不推荐使用WaitAny,但我无法使它与例如WhenAll一起工作

另外,我的应用程序中的“真正”异步方法可能需要相当长的时间才能完成,大约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);
    }
}
类异步测试
{
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.
  }
}