Всегда ли асинхронный асинхронный в C #? [Дубликат]
На этот вопрос уже есть ответ здесь:
C # Async - Как это работает? 3 ответаЯ занимаюсь НИОКР наasync
а такжеawait
для моего проекта. Я узнал, что когдаasync
Метод вызывается, он освобождает поток и позволяет другим использовать этот поток. Мы можем установить обратный вызов для ожидаемого метода, используяawait
Ключевое слово и этот метод возвращает значение, когда результат готов. Если это произойдет:
UI
кратко между операциями.Время выполнения должно быть быстрее обычного синхронного вызова метода.В моем случае у меня нет вопросов оpoint 1
, Но дляpoint 2
время выполнения похоже на синхронный вызов метода. Например, см.Sample Code 1
а такжеSample Output 1
Пример кода 1:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Before Async Call");
AsyncMethod();
Console.WriteLine("After Async Call");
Console.ReadLine();
}
public async static void AsyncMethod()
{
var firstValue = FirstAsyncMethod("FirstAsyncMethod has been called");
Console.WriteLine("Middle of FirstAsyncMethod and SecondAsyncMethod");
var secondValue = SecondAsyncMethod("SecondAsyncMethod has been called");
Console.WriteLine(await firstValue);
Console.WriteLine(await secondValue);
}
public static async Task<string> FirstAsyncMethod(string value)
{
for (int i = 0; i < 500000000; i++)
{
i = i + 1 - 1;
}
return "Success: "+value;
}
public static async Task<string> SecondAsyncMethod(string value)
{
for (int i = 0; i < 500000000; i++)
{
i = i + 1 - 1;
}
return "Success: " + value;
}
}
Пример вывода 1:
Before Async Call
Middle of FirstAsyncMethod and SecondAsyncMethod
Success: FirstAsyncMethod has been called
Success: SecondAsyncMethod has been called
After Async Call
Но если я позвонюasync
метод сTask.Run(()=> )
(НапримерSample Code 2
а такжеSample Output 2
), это уменьшает время выполнения по сравнению с первым примером (Sample Code 1
).
Пример кода 2:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Before Async Call");
AsyncMethod();
Console.WriteLine("After Async Call");
Console.ReadLine();
}
public async static void AsyncMethod()
{
var firstValue =Task.Run(()=> FirstAsyncMethod("FirstAsyncMethod has been called"));
Console.WriteLine("Middle of FirstAsyncMethod and SecondAsyncMethod");
var secondValue = Task.Run(() => SecondAsyncMethod("SecondAsyncMethod has been called"));
Console.WriteLine(await firstValue);
Console.WriteLine(await secondValue);
}
public static async Task<string> FirstAsyncMethod(string value)
{
for (int i = 0; i < 500000000; i++)
{
i = i + 1 - 1;
}
return "Success: "+value;
}
public static async Task<string> SecondAsyncMethod(string value)
{
for (int i = 0; i < 500000000; i++)
{
i = i + 1 - 1;
}
return "Success: " + value;
}
}
Пример вывода 2:
Before Async Call
Middle of FirstAsyncMethod and SecondAsyncMethod
After Async Call
Success: FirstAsyncMethod has been called
Success: SecondAsyncMethod has been called
У меня вопрос, почему первый пример (Sample Code 1
) занимает время, как синхронный вызов метода?