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!")); } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д