Prawdziwe zalety Async-Await?

Wcześniej pisałemto pytanie dotyczące stosowania Async-Await na kliencie lub w serwisie. Przeczytaj to pytanie przed podjęciem tego pytania, ponieważ jest ono ściśle powiązane z pytaniem.

Na podstawie odpowiedzi przetestowałem kod dla C # 4.0 (TPL) i C # 5.0 (Async - Await). Wywoływam usługę przy użyciu asynchronicznej i synchronizowanej wersji metody dostarczanej przez usługę i porównując liczbę wątków używanych w każdym przypadku. Poniżej znajduje się kod, którego używam do testowania używanych zasobów:

GŁÓWNA METODA

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());

Async and Sync CAlls Do usługi

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;
}

Teraz pracowałem nad odpowiedzią i odkryłem następujące wyniki:

Jeśli wykonam 500 połączeń do usługi, używa tylko 4-5 wątków.Połączenia TPL to około 44-45 wątków.Czas połączeń asynchronicznych wynosi około 17 - 18 sekundCzas na połączenia TPL to około 42 - 45 sekund.

Chcę mieć pewne informacje zwrotne na temat moich odkryć, aby były przydatne także dla innych członków społeczności. Czy to jest odpowiedź na moje wcześniejsze pytanie?

EDYTOWAĆ

Pyt. Z moich obserwacji wynika, że ​​jeśli użyjemy Async-Await zamiast Task.Factory.startNew TPL, to zajmie on mniej wątków. W JAKI SPOSÓB TO PRAWIDŁOWO? JEŚLI NIE, TO CZYM JEST WŁAŚCIWY KIERUNEK, KTÓRY MOŻE DOSTAĆ W TAKIM PORÓWNANIU?

Pyt .: Jak uczę się asynchronicznie - zaczekaj, chcę udowodnić swoją wartość przez porównanie i solidny kod.

questionAnswers(1)

yourAnswerToTheQuestion