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

C# 如何强制Paralled.Invoke等待所有任务完成?,c#,asp.net,.net-core,C#,Asp.net,.net Core,我正在使用Parallel.invoke执行多个任务,但它会在所有操作完成之前返回响应。我想在调用方法时使用wait键盘,因为所有方法都是async,但它不允许我这样做。我也知道我可以使用Task.WhenAll(),但要求是使用Parallel.Invoke那么有什么方法可以实现我的目标吗 var list = new List<string>(); var myArr = new string[] { "usa", "eng", "fra" }; Parallel.Invok

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

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);
    });
});
var list=newlist();
var myArr=新字符串[]{“usa”、“eng”、“fra”};
Parallel.Invoke(()=>
{
myArr.Select(i=>{
var数据=MyMethod(i);
列表。添加(1,数据);
});
});
以及MyMethod的实现

public async Task<string> GetName(string country)
{
    var data = await _db.GetAll().FindAsync(country).Capital;
    return data;
}
公共异步任务GetName(字符串国家/地区)
{
var data=await_db.GetAll().FindAsync(country.Capital);
返回数据;
}
我还有另一个问题,在
Parallel.Invoke

var list=new list()中是否有更好的方法调用该方法3或4次;
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);
var myArr=新字符串[]{“usa”、“eng”、“fra”}; var tasks=myArr.Select(o=>GetName(o)); var结果=等待任务.WhenAll(任务);
var list=new list();
var myArr=新字符串[]{“usa”、“eng”、“fra”};
var tasks=myArr.Select(o=>GetName(o));
var结果=等待任务.WhenAll(任务);
我也知道我可以使用Task.WhenAll(),但要求是 那么有什么方法可以实现我的目标吗

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);
    });
});
您对使用
Parallel.Invoke
的要求可能是错误的

您的
GetName
方法是。将此线程化几乎没有什么好处。你所做的就是产生更多的线程,然后你必须等待异步结果。这比循环效率低

以异步方式运行它会更有意义。这样,您就不会使用不必要的线程,但可以更有效地使用主线程。您可以使用
任务来执行此操作。当所有

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;
}
var list=newlist();
var myArr=新字符串[]{“usa”、“eng”、“fra”};
IEnumerable myTasks=myArr.Select(i=>{
姓名(一);
});
等待任务。WhenAll(我的任务);
foreach(myTasks中的任务)
{
字符串结果=task.result;
}
我也知道我可以使用Task.WhenAll(),但要求是 那么有什么方法可以实现我的目标吗

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);
    });
});
您对使用
Parallel.Invoke
的要求可能是错误的

您的
GetName
方法是。将此线程化几乎没有什么好处。你所做的就是产生更多的线程,然后你必须等待异步结果。这比循环效率低

以异步方式运行它会更有意义。这样,您就不会使用不必要的线程,但可以更有效地使用主线程。您可以使用
任务来执行此操作。当所有

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;
}
var list=newlist();
var myArr=新字符串[]{“usa”、“eng”、“fra”};
IEnumerable myTasks=myArr.Select(i=>{
姓名(一);
});
等待任务。WhenAll(我的任务);
foreach(myTasks中的任务)
{
字符串结果=task.result;
}


Parallel.Invoke()
等待生成的所有任务完成。您的代码中一定有错误。您正在调用的方法的签名是什么?谢谢您的回复。让我重新检查我的代码。还有一件事我忘了在问题中提到,我想将异步方法返回的响应添加到列表中,这样我就可以在不使用wait关键字的情况下完成这项工作刚才询问这些方法是否返回
任务
,然后
并行。Invoke
将立即返回,因为它不关心任务是否正在运行。method1基本上是一个异步方法,从http请求返回响应。我想在列表中添加该响应,比如{var a=method1();list.add(a)}
Parallel.Invoke()
等待它生成的所有任务完成。您的代码中一定有错误。您正在调用的方法的签名是什么?谢谢您的回复。让我重新检查我的代码。还有一件事我忘了在问题中提到,我想将异步方法返回的响应添加到列表中,这样我就可以在不使用wait关键字的情况下完成这项工作刚才询问这些方法是否返回
任务
,然后
并行。Invoke
将立即返回,因为它不关心任务是否正在运行。method1基本上是一个异步方法,从http请求返回响应。我想在列表中添加这个响应,比如{var a=method1();list.add(a)}我已经有了这个解决方案,但是我的朋友被说服使用Paraller。Invoke@Ask在现代C#中,使用Task、async和await是更可取的方法solutions@Ask你的朋友错了谢谢,最后一个问题。我可以在这里使用Paraller.ForEach()吗?@Liam是的,关于Task.Run,您是对的,但返回是必需的。我已经有了这个解决方案,但我的朋友被说服使用Paraller。Invoke@Ask在现代C#中,使用Task、async和await是更可取的方法solutions@Ask你的朋友错了谢谢,最后一个问题。我可以在这里使用Paraller.ForEach()吗?@Liam是的,关于Task.Run你是对的,但是返回的是needn'tthanks,另外一件事我可能需要在dictionary中添加GetName()响应,而不是列表。因此,这种方法适合(int i=0 i)吗?我想,在异步调用返回后,您需要处理
字典。但不清楚您在注释中询问了什么。可能会问一个新问题。谢谢,另外一件事是,我可能需要在字典中添加GetName()响应,而不是列表。这种方法适合吗(int i=0 i我想,在异步调用返回后,您需要处理
字典
。但不清楚您在评论中问了什么。可能会问一个新问题