我有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調用。 –