即使使用 await 运算符,异步方法调用 运行 也是同步的
Async method call running synchronously even with await operator
我正在尝试从控制台应用程序调用此异步方法。我期待我的方法的“a”部分在等待 ReturnsString() 时异步 运行 但事实并非如此,一切似乎都是同步执行的。我不明白为什么。
抱歉我的英语不好。
output
public class AsyncAwaitExe3
{
public async Task<string> DoAsync()
{
string toReturn = "";
Console.WriteLine("I'm here A");
//a
for (int i = 0; i < 30; i++)
{
Console.WriteLine($"inside for {i}");
Thread.Sleep(1000);
}
//b
Console.WriteLine("I'm here B");
toReturn = await ReturnsString();
//c
Console.WriteLine("I'm here C");
return toReturn;
}
public async Task<string> ReturnsString()
{
Console.WriteLine("I'm here D");
await Task.Delay(2000);
Console.WriteLine("I'm here E");
return "sharp sword";
}
}
static void Main(string[] args)
{
AsyncAwaitExe3 exe3 = new AsyncAwaitExe3();
Console.WriteLine(exe3.DoAsync());
Console.ReadKey();
}
a 部分是同步代码——没有任何关于 returns 任务同时继续 运行 的内容。如果你希望它是异步的,你可以将它分解成一个不同的异步方法。然后使用 Task.WhenAll
.
等待两者完成
此外,您必须使用 Task.Delay()
而不是 Thread.Sleep()
。 Task.Delay
returns 一个你可以等待的任务; Thread.Sleep
只是同步阻塞线程。
async Task RunSectionA()
{
Console.WriteLine("I'm here A");
for (int i = 0; i < 30; i++)
{
Console.WriteLine($"inside for {i}");
await Task.Delay(1000);
}
}
public async Task<string> DoAsync()
{
var taskA = RunSectionA();
var taskB = ReturnsString();
await Task.WhenAll(taskA, taskB);
return await taskB;
}
我正在尝试从控制台应用程序调用此异步方法。我期待我的方法的“a”部分在等待 ReturnsString() 时异步 运行 但事实并非如此,一切似乎都是同步执行的。我不明白为什么。
抱歉我的英语不好。
output
public class AsyncAwaitExe3
{
public async Task<string> DoAsync()
{
string toReturn = "";
Console.WriteLine("I'm here A");
//a
for (int i = 0; i < 30; i++)
{
Console.WriteLine($"inside for {i}");
Thread.Sleep(1000);
}
//b
Console.WriteLine("I'm here B");
toReturn = await ReturnsString();
//c
Console.WriteLine("I'm here C");
return toReturn;
}
public async Task<string> ReturnsString()
{
Console.WriteLine("I'm here D");
await Task.Delay(2000);
Console.WriteLine("I'm here E");
return "sharp sword";
}
}
static void Main(string[] args)
{
AsyncAwaitExe3 exe3 = new AsyncAwaitExe3();
Console.WriteLine(exe3.DoAsync());
Console.ReadKey();
}
a 部分是同步代码——没有任何关于 returns 任务同时继续 运行 的内容。如果你希望它是异步的,你可以将它分解成一个不同的异步方法。然后使用 Task.WhenAll
.
此外,您必须使用 Task.Delay()
而不是 Thread.Sleep()
。 Task.Delay
returns 一个你可以等待的任务; Thread.Sleep
只是同步阻塞线程。
async Task RunSectionA()
{
Console.WriteLine("I'm here A");
for (int i = 0; i < 30; i++)
{
Console.WriteLine($"inside for {i}");
await Task.Delay(1000);
}
}
public async Task<string> DoAsync()
{
var taskA = RunSectionA();
var taskB = ReturnsString();
await Task.WhenAll(taskA, taskB);
return await taskB;
}