Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.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# 异步调用多个Web服务_C#_Asp.net_Multithreading_Web Services - Fatal编程技术网

C# 异步调用多个Web服务

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

我得到了一个包含URL、一些数据和用户Id的对象列表。我想编写一个函数来异步调用不同的web服务,并在列表中返回响应列表和用户Id。但如果URL相同,则调用应与输入中提供的不同数据的特定服务同步。

您可以按照以下步骤进行操作 -按url对列表进行分组 -将分组项传递给单独的异步方法 -第二种方法将使服务调用同步

请参考以下代码

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服务”是什么?你应该先阅读,然后提供答案。如果您知道如何同步调用服务,那么请向我们展示该代码。然后我们可以给你更多的答案。