我设计了一个Window From应用程序,看看如果主线程进入休眠状态,async
方法是否仍然有效。这是:
1-点击Async按钮,等待AsyncMethod
。
2-点击Sleep按钮,主线程休眠。
我知道等待AsyncMethod
是如何工作的:使用状态机,它返回给调用者,但它仍在工作和活着。我没有任何问题。简单而整洁!
我不明白的是这个方法执行的位置和方式。为什么让主线程处于休眠状态并不会暂停AsyncMethod
?
以下是代码:
private async void btnAsync_Click(object sender, EventArgs e)
{
await AsyncMethod(TimeSpan.FromSeconds(10));
}
private void btnSleep_Click(object sender, EventArgs e)
{
Thread.Sleep(TimeSpan.FromSeconds(10));
}
public async Task AsyncMethod(TimeSpan duration)
{
await Task.Run(() =>
{
DateTime start = DateTime.Now;
TimeSpan ellapsed = DateTime.Now - start;
int lastReport = 0;
Console.Write("Working");
while (ellapsed < duration)
{
ellapsed = DateTime.Now - start;
if (lastReport < Math.Ceiling(ellapsed.TotalSeconds))
{
lastReport = (int)Math.Ceiling(ellapsed.TotalSeconds);
Console.Write(".");
}
}
Console.Write("Finished");
});
}
答案 0 :(得分:1)
我不明白的是这种方法的位置和方式 执行。为什么让主线程处于休眠状态并不会暂停 AsyncMethod?
此方法由CLR的托管线程池中的线程执行。如果这是真的,那么负责你的UI的应用程序中的主线程将被冻结,而它正在处理你的async方法的执行,并且UI exprerience不是最好的。
此外,这是Task.Run
方法的目的。根据{{3}}
将指定的工作排队以在ThreadPool上运行并返回任务 或该任务的任务句柄。