Я новичок в C#, и пока я пытаюсь понять async/await feautures. Таким образом, я создал небольшую песочницу приложения:C# async ждет странное поведение
namespace sandbox
{
public class Test
{
public async Task<string> GetItemsAsync()
{
var a = await Task1();
var b = await Task2();
var c = await Task3();
return a + b + c;
}
public string GetItems()
{
return _T1() + _T2() + _T3();
}
private readonly int cycles = 100000000;
private async Task<string> Task1()
{
return await Task.Factory.StartNew(_T1);
}
private async Task<string> Task2()
{
return await Task.Factory.StartNew(_T2);
}
private async Task<string> Task3()
{
return await Task.Factory.StartNew(_T3);
}
// long running operation
private string _T1()
{
for (int i = 0; i < cycles; i++) ;
for (int i = 0; i < cycles; i++) ;
return "One";
}
// long running operation
private string _T2()
{
for (int i = 0; i < cycles; i++) ;
for (int i = 0; i < cycles; i++) ;
return "Two";
}
// long running operation
private string _T3()
{
for (int i = 0; i < cycles; i++) ;
for (int i = 0; i < cycles; i++) ;
return "Three";
}
}
class Program
{
static void Main(string[] args)
{
var t = new Test();
Console.WriteLine("Async");
Stopwatch sw = new Stopwatch();
sw.Start();
var result = t.GetItemsAsync();
Console.WriteLine(result.Result);
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Console.WriteLine("Sync");
sw.Restart();
var strResult = t.GetItems();
Console.WriteLine(strResult);
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
Console.ReadLine();
}
}
}
Но результат странно:
Async
OneTwoThree
1754
Sync
OneTwoThree
1506
метод Асинхронного работает дольше, чем аналогичные синхронизации один. Для меня это похоже, что методы async работают синхронно, но я не могу понять, почему.
Потому что вы ожидаете их всех синхронно. – Liam
, ожидая задачи, вы меняете ее с асинхронного на синхронный, ключевое слово await переводит приостановку текущей задачи и не продолжается до тех пор, пока ожидаемая задача не завершится – MikeT
Использование ожидания приведет к тому, что код будет выполняться синхронно, а также добавьте накладные расходы создание конечного автомата (каждый раз, когда вы используете 'await'), поэтому он также медленнее, чем запуск их синхронно. – Igor