C# - 同时调用Web服务/使用限制调用异步

时间:2017-03-24 23:13:48

标签: c# web-services asynchronous

如何使用C#同时调用多次Web服务x?

我有一个客户表(大约100万),我需要拨打5000个客户的Web服务来返回一些信息并写入文件。

我尝试过使用async / await和TPL Dataflow库,但代码比使用普通的旧同步方法要慢得多。以下是我想要实现的目标的摘要。代码将从无法标记为异步的控制台应用程序(主方法)运行。

public void GenerateCustomerFile(){

     var outputFileName = "MyCustomerFile.txt";
     var customers = CustomerRepo.GetCustomers();
     var customerBatch = new List<Customer>();     

     foreach(var customer in customers){

        customerBatch.Add(customer);

        if(customerBatch.Count >= 20000){
            // Call web service concurrently (4 threads with 5000 customers each)
           // Write results to file
           customerBatch.Clear();
        }
     }
}

1 个答案:

答案 0 :(得分:0)

为什么要使用循环?您可以将其拆分并发送5K批次

var customerBatch = CustomerRepo.GetCustomers();
const int batchSize = 5000;
var sendingTasks = Enumerable.Range(0,(customerBatch.Length/batchSize)).Select(async a=>{
   var section = customerBatch.Skip(a*batchSize).Take((a+1)*batchSize);
   await "https://lolcow.com/api/entity".PostJsonAsync(section);
});
await Task.WhenAll(sendingTasks);

我正在使用Flurl来获取http请求,并不确定你使用的是什么..但是这应该做你正在做的事情...如果它比只做所有这些要慢,那么你可能会需要使批量更大

关于主要方法和异步的问题,我通常做的只是做一个主要的异步并在我的main方法中用wait调用

public static async Task MainAsync(string[] args)
{
    //do stuff here
}

public static void Main(string[] args)
{
    MainAsync(args).Wait();
}