[英]Putting main thread to sleep has no effect on Task.Run, why?
我设计了一个Window From应用程序,以查看如果主线程进入睡眠状态, async
方法是否仍然有效。 这里是:
1-通过单击异步按钮,等待AsyncMethod
。
2-单击“睡眠”按钮,主线程进入睡眠状态。
我知道等待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");
});
}
我不了解的是在哪里以及在哪个线程上执行此方法。 为什么将主线程置于睡眠状态不会暂停AsyncMethod?
该方法由CLR的托管线程池中的线程执行。 如果这是真的,那么应用程序中负责UI的主线程将被冻结,而该线程正在执行异步方法,并且UI体验不是最好的。
此外,这是Task.Run
方法的目的。 根据MSDN
将指定的工作排队以在ThreadPool上运行,并返回该工作的任务或任务句柄。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.