我正在使用/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次?
答案 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;
}