繁体   English   中英

使主线程进入睡眠状态对Task.Run没有影响,为什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM