Ho 30 aziende secondarie e ognuna ha implementato il proprio servizio web (con diverse tecnologie).Il modo migliore per chiamare molti servizi web?
Ho bisogno di implementare un servizio web per aggregarli, ad esempio tutti i servizi web delle sub-società hanno un metodo web con nome GetUserPoint(int nationalCode)
e ho bisogno di implementare il mio servizio web che chiamerà tutti loro e raccoglierà tutto il risposte (ad esempio somma di punti).
Questa è la mia classe di base:
public abstract class BaseClass
{ // all same attributes and methods
public long GetPoint(int nationalCode);
}
Per ciascuno dei sub Aziende Servizi web, implemento una classe che eredita questa classe di base e definire il proprio metodo GetPoint
.
public class Company1
{
//implement own GetPoint method (call a web service).
}
a
public class CompanyN
{
//implement own GetPoint method (call a web service).
}
così, questo è il mio metodo 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, funziona ma è così lento, perché ogni sub companys servizio web è ospitato su server diversi (su internet).
posso usare programmazione parallela in questo modo: (è questo chiamato programmazione parallela !?)
foreach (var item in Clients)
{
Tasks.Add(Task.Run(() =>
{
Result.AddRange(item.GetPoint(MasterLogId, mobileNumber));
}
}
Penso programmazione parallela (e filettatura) non è buono per questa soluzione, perché la mia soluzione è legata IO (non ad alta intensità di CPU)!
Chiama ogni servizio Web esterno è così lento, ho ragione? Molti thread che sono in sospeso per ottenere risposta!
Penso che la programmazione asincrona sia la migliore, ma io sono nuovo alla programmazione asincrona e alla programmazione parallela.
Qual è il modo migliore? (parallel.foreach - async TAP - APM asincrono - asincrono EAP -threading)
Si prega di scrivere per me un esempio.
Hai tutte le nozioni di base giuste. È un buon inizio. 'Parallel.ForEach' e' Thread's soffrono dello stesso problema di 'Task.Run' - sono utili per la CPU, non per il lavoro legato all'IO. TAP è sicuramente il più facile da comporre (in pratica si mantiene il loop corrente, ma la roba di I/O diventa "senza fili" e molto scalabile). APM ed EAP sono facilmente convertibili in TAP (tramite 'Task.Factory.FromAsync' per APM e' TaskCompletionSource' per EAP), quindi puoi andare con TAP e collegare le chiamate APM ed EAP se questo è ciò che forniscono le API esistenti. –