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!"));
}
}