如何强制Paralled.Invoke等待所有任务完成?

时间:2018-07-20 10:36:06

标签: c# asp.net .net-core

我正在使用/node_modules/@angular/material/schematics/collection.json执行多个任务,但是它会在所有操作完成之前返回响应。我想在调用方法时使用等待键盘,因为所有方法都是Parallel.invoke,但我不允许这样做。我也知道我可以使用async,但要求是使用Task.WhenAll(),所以有什么办法可以实现我的目标?

Parallel.Invoke

和MyMethod实现

var list = new List<string>();
var myArr = new string[] { "usa", "eng", "fra"  };

Parallel.Invoke(() =>
{
    myArr.Select(i => {
        var data= MyMethod(i);
        list.Add(1, data);
    });
});

我还有另一个问题,是否有更好的方法可以在public async Task<string> GetName(string country) { var data = await _db.GetAll().FindAsync(country).Capital; return data; } 内将方法调用3或4次?

2 个答案:

答案 0 :(得分:1)

var list = new List<string>();
var myArr = new string[] { "usa", "eng", "fra" };

var tasks = myArr.Select(o => GetName(o));

var results = await Task.WhenAll(tasks);

答案 1 :(得分:1)

  

我也知道我可以使用Task.WhenAll(),但要求是使用   Parallel.Invoke,有什么办法可以实现我的目标?

您使用Parallel.Invoke的要求可能是错误的。

您的GetName方法是IO bound。对此进行线程化几乎没有好处。您要做的只是生成更多线程,然后必须await进行异步处理。这比循环要效率低

异步运行此命令更有意义。这样,您就不会使用不必要的线程,而是可以更有效地使用主线程。您可以使用Task.WhenAll

var list = new List<string>();
var myArr = new string[] { "usa", "eng", "fra"  };
IEnumerable<Task<string>> myTasks = myArr.Select(i => {
                    GetName(i);
                });

await Task.WhenAll(myTasks);
foreach(Task<string> task in myTasks)
{
     string result = task.Result;
}