In precedenza ho postato la domanda this relativa all'applicazione di Async-Await al client o al servizio. Leggi la domanda prima di andare avanti con questa domanda poiché è strettamente correlata alla domanda.Veri vantaggi di Async-Await?
Sulla base della risposta ho testato il codice per C# 4.0 (TPL) e C# 5.0 (Async - Attesa). Sto chiamando il servizio usando la versione asincrona e sincronizzata del metodo fornito dal servizio e confrontando il numero di thread utilizzati in ciascun caso. seguito è il codice che sto usando per testare le risorse utilizzate:
Metodo principale
List<Task<string>> tasksList = new List<Task<string>>();
List<int> asyncThreads = new List<int>();
List<int> tplThreads = new List<int>();
Stopwatch watch = new Stopwatch();
watch.Start();
// Call the Async version of the method
for (int i = 0; i < 500; i++)
{
tasksList.Add(GetNameFromServiceAsync("Input" + i.ToString(), asyncThreads));
}
Task.WaitAll(tasksList.ToArray());
watch.Stop();
foreach (var item in asyncThreads.Distinct())
{
Console.WriteLine(item);
}
Console.WriteLine("(C# 5.0)Asynchrony Total Threads = " + asyncThreads.Distinct().Count());
Console.WriteLine(watch.ElapsedMilliseconds.ToString());
watch.Restart();
tasksList.Clear();
// Call the normal method
for (int i = 0; i < 500; i++)
{
tasksList.Add(GetNameFromService("Input" + i.ToString(), tplThreads));
}
Task.WaitAll(tasksList.ToArray());
watch.Stop();
foreach (var item in tplThreads.Distinct())
{
Console.WriteLine(item);
}
Console.WriteLine("(C# 4.0)TPL Total Threads" + tplThreads.Distinct().Count());
Console.WriteLine(watch.ElapsedMilliseconds.ToString());
asincrona e Sync chiamate al servizio
static async Task<string> GetNameFromServiceAsync(string name, List<int> threads)
{
Console.WriteLine(" Start Current Thread : " + System.Threading.Thread.CurrentThread.ManagedThreadId);
var task = await client.GetNameAsync(name);
threads.Add(System.Threading.Thread.CurrentThread.ManagedThreadId);
// Console.WriteLine("End GetNameFromServiceAsync Current Thread : " + System.Threading.Thread.CurrentThread.ManagedThreadId);
return task;
}
static Task<string> GetNameFromService(string name, List<int> threads)
{
var task = Task<string>.Factory.StartNew(() =>
{
threads.Add(System.Threading.Thread.CurrentThread.ManagedThreadId);
// Console.WriteLine("GetNameFromService Current Thread : " + System.Threading.Thread.CurrentThread.ManagedThreadId);
return client.GetName(name);
});
return task;
}
Ora ho ha lavorato sulla risposta e ha trovato i seguenti risultati:
- Se faccio 500 chiamate al servizio usa solo 4-5 thread.
- Le chiamate TPL producono circa 44-45 thread.
- Il tempo per le chiamate asincrone è di circa 17 - 18 secondi
- Il tempo per le chiamate TPL è di circa 42 - 45 secondi.
Voglio avere un feedback sulle mie scoperte in modo che possa essere utile anche agli altri membri della comunità. E 'questa la risposta della mia precedente domanda ??
EDIT
D. La mia osservazione conclude che se usiamo Async-Await invece di Task.Factory.startNew di TPL, allora si consumano discussioni minori. QUANTO CORRETTO È QUESTO? SE NO, QUINDI QUAL È LA GIUSTA SENSA DI RAGGIUNGERE UN CONFRONTO TALE?
Q. Mentre sto imparando async - attendo, voglio dimostrare il suo valore con una sorta di confronto e codice solido.
Qual è esattamente la tua domanda? –
Usando async - attendi possiamo ottenere vantaggi di memoria (saranno utilizzate meno risorse). Questo è ciò che ho ottenuto dalla mia precedente domanda o ciò che ho capito e voglio sapere è questa la risposta. Voglio chiedere nel contesto dei vantaggi di scalabilità usando async-await. È in linea con quello che ho concluso? –
Un vantaggio importante ed è esplicito, che gli utenti non possono dire di aver affrontato un problema asincrono quando eseguivano il codice sincrono. –