C# 异步调用多个Web服务
我得到了一个包含URL、一些数据和用户Id的对象列表。我想编写一个函数来异步调用不同的web服务,并在列表中返回响应列表和用户Id。但如果URL相同,则调用应与输入中提供的不同数据的特定服务同步。您可以按照以下步骤进行操作 -按url对列表进行分组 -将分组项传递给单独的异步方法 -第二种方法将使服务调用同步 请参考以下代码C# 异步调用多个Web服务,c#,asp.net,multithreading,web-services,C#,Asp.net,Multithreading,Web Services,我得到了一个包含URL、一些数据和用户Id的对象列表。我想编写一个函数来异步调用不同的web服务,并在列表中返回响应列表和用户Id。但如果URL相同,则调用应与输入中提供的不同数据的特定服务同步。您可以按照以下步骤进行操作 -按url对列表进行分组 -将分组项传递给单独的异步方法 -第二种方法将使服务调用同步 请参考以下代码 List<Response> DoTask(List<MyObject> list) { var groupedList = list.Gr
List<Response> DoTask(List<MyObject> list)
{
var groupedList = list.GroupBy(x => x.Url)
var taskList = new List<Task<List<Response>>>();
foreach(group in GroupList)
{
taskList.Add(CallService(group.ToList()))
}
Task.WaitAll(taskList.ToArray());
return taskList.SelectMany(x => x.Result);
}
// This method would get service call of same urls only
async Task<List<Response>> CallService(List<MyObject> list)
{
var responseList = new List<Response>();
foreach(var item in list)
{
var response = new Response();
response.Result = await HttpServiceCall(MyObject object);
response.UserId = item.UserId
responseList.Add(response);
}
return responseList;
}
async Task<Response> HttpServiceCall(MyObject object)
{
//make service call
}
列表点任务(列表)
{
var groupedList=list.GroupBy(x=>x.Url)
var taskList=新列表();
foreach(组列表中的组)
{
taskList.Add(CallService(group.ToList()))
}
Task.WaitAll(taskList.ToArray());
返回任务列表。选择多个(x=>x.Result);
}
//此方法将仅获取相同URL的服务调用
异步任务调用服务(列表)
{
var responseList=新列表();
foreach(列表中的变量项)
{
var响应=新响应();
response.Result=等待HttpServiceCall(MyObject对象);
response.UserId=item.UserId
响应列表。添加(响应);
}
返回应答器;
}
异步任务HttpServiceCall(MyObject对象)
{
//打服务电话
}
我对async/await的理解仍不尽如人意,因此我99%确信我看错了。如果您在循环中一个接一个地等待每个HttpServiceCall
,这难道不意味着尽管它们是异步的,但它们仍然按顺序一个接一个地执行吗?这仍然比不异步要好,但这不是比更可取吗?当所有这些任务都是时?(我还在努力学习。)是的,您是对的,HttpServiceCall将按顺序运行,因为所有调用都在等待中,如果您不需要在此处或应用程序中的任何其他位置异步执行此操作,那么您应该在不使用异步的情况下定义此方法。如果不需要,建议不要将方法设置为异步,因为单个线程的性能要比多个线程顺序运行的性能好。你是在问在WaitAll的位置使用WhenAll吗?如果我理解正确(这是非常可疑的),等待一个调用,然后等待另一个调用,然后等待另一个调用意味着当每个请求发出时,线程可以自由地做其他事情。当调用完成时,下一个调用开始,线程也可以做其他事情。但是whalll
将避免强制按顺序完成调用。如果您询问使用WhenAll而不是Wait in the loop,那么这将违反您的问题陈述,因为如果“url”相同,则需要按顺序运行任务,并且WhenAll任务将异步运行。第二件事是,,,一个线程比多个线程顺序运行要好,因为多个线程会有更多的线程切换,这是一项成本高昂的任务,会影响性能。你说的“不同的web服务”是什么?你应该先阅读,然后提供答案。如果您知道如何同步调用服务,那么请向我们展示该代码。然后我们可以给你更多的答案。