Async и Await, нет параллельности - C#

Узнай цену своей работы

Формулировка задачи:

Вот код :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
 
namespace AsyncAndAwaitWTF
{
    class AddParams
    {
        public int a;
        public int b;
    }
    class Program
    {
        static void Main(string[] args)
        {
            AddAsync(5,5);
            Console.WriteLine("Its realy method Main()");
            Console.ReadLine();
        }
 
        private static async void AddAsync(int a, int b)
        {
            Console.WriteLine("Adding with Thread objects");
            Console.WriteLine("ID of thread Main() : {0}",
                Thread.CurrentThread.ManagedThreadId);
 
            AddParams param = new AddParams()
            {
                a = a,
                b = b
            };
            await Add(param);
            Console.WriteLine("Other thread is done!");
        }
 
        private static async Task Add(object data)
        {
            await Task.Run(() =>
            {
                AddParams param = data as AddParams;
                if (param != null)
                {
                    Console.WriteLine("ID of thread Add() : {0}",
                        Thread.CurrentThread.ManagedThreadId);
                    Console.WriteLine("{0} + {1} = {2}",
                        param.a, param.b, param.a + param.b);
                    Thread.Sleep(1000);
                }
            });
        }
    }
}
Результат желает быть лучше, получаю действительно асинхронный вызов - в новом потоке, но программа не идет дальше после вызова

AddAsync(5,5);

Толку тогда от этого асинхронного вызова. Получается что

await

, не даёт продолжать выполнение пока не закончиться выполняться метод под его обьявлением.

Решение задачи: «Async и Await, нет параллельности»

textual
Листинг программы
using System;
using System.Threading;
using System.Threading.Tasks;
 
class Program
{
        static void Main(string[] args)
        {
            Test().Wait();
        }
 
        static async Task Test()
        {
            Action action = () => {
                Console.WriteLine("Thread {0} start", Thread.CurrentThread.ManagedThreadId);
 
                int i = 10;
 
                while(i-- > 0)
                {
                    Thread.Sleep(1000);
                    Console.WriteLine("Thread {0} work work!", Thread.CurrentThread.ManagedThreadId);
                }
 
                Console.WriteLine("Thread {0} end", Thread.CurrentThread.ManagedThreadId);
            };
 
            Task t1 = Task.Factory.StartNew(action);
            Task t2 = Task.Factory.StartNew(action);
            Task t3 = Task.Factory.StartNew(action);
            Task t4 = Task.Factory.StartNew(action);
            Task t5 = Task.Factory.StartNew(action);
 
            await Task.Factory.ContinueWhenAll(new[] { t1, t2, t3, t4, t5 }, (t) => Console.WriteLine("Work complete!"));
        }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4 из 5