我有30个子公司,每个人都实施了他们的网络服务(使用不同的技术)。调用许多Web服务的最佳方法?
我需要实现一个Web服务来聚合它们,例如,所有子公司Web服务都有一个名为GetUserPoint(int nationalCode)
的Web方法,我需要实现我的Web服务,它将调用所有这些服务并收集所有的响应(例如点数的总和)。
这是我的基类:
public abstract class BaseClass
{ // all same attributes and methods
public long GetPoint(int nationalCode);
}
对于每个子企业的Web服务,我实现了继承这个基类的类和定义自己GetPoint
方法。
public class Company1
{
//implement own GetPoint method (call a web service).
}
到
public class CompanyN
{
//implement own GetPoint method (call a web service).
}
所以,这是我的Web方法:
[WebMethod]
public long MyCollector(string nationalCode)
{
BaseClass[] Clients = new BaseClass[] { new Company1(),//... ,new Company1()}
long Result = 0;
foreach (var item in Clients)
{
long ResultTemp = item.GetPoint(nationalCode);
Result += ResultTemp;
}
return Result;
}
OK,它的工作原理,但它是如此缓慢,是因为每个子公司的Web服务在不同的服务器托管(在网上)。
我可以使用并行编程是这样的:(这是所谓的并行编程!?)
foreach (var item in Clients)
{
Tasks.Add(Task.Run(() =>
{
Result.AddRange(item.GetPoint(MasterLogId, mobileNumber));
}
}
我认为平行编程(和线程)不利于这个解决方案,因为我的解决办法是IO绑定(而不是CPU密集型)!
调用每个外部Web服务是如此之慢,我说得对吗?很多正在等待得到响应的线程!
我认为异步编程是最好的方法,但我是异步编程和并行编程的新手。
什么是最好的方法? (parallel.foreach - async TAP - async APM - async EAP -threading)
请为我写一个例子。
你已经掌握了所有的基础知识。这是一个非常好的开始。 'Parallel.ForEach'和'Thread's遭遇与Task.Run相同的问题 - 它们对于CPU来说是好事,而不是对IO进行绑定的工作。 TAP绝对是最容易编写的(你基本上保持当前的循环,但IO的东西变得“无螺纹”和非常可扩展的)。 APM和EAP很容易转换为TAP(通过APM的'Task.Factory.FromAsync'和EAP的TaskCompletionSource'),所以如果这是您现有的API提供的,您可以使用TAP并插入APM和EAP调用。 –