将主线程置于睡眠状态对Task.Run没有影响,为什么?

时间:2015-11-17 06:48:49

标签: c# multithreading asynchronous

我设计了一个Window From应用程序,看看如果主线程进入休眠状态,async方法是否仍然有效。这是:

1-点击Async按钮,等待AsyncMethod

2-点击Sleep按钮,主线程休眠。

我知道等待AsyncMethod是如何工作的:使用状态机,它返回给调用者,但它仍在工作和活着。我没有任何问题。简单而整洁!

我不明白的是这个方法执行的位置和方式。为什么让主线程处于休眠状态并不会暂停AsyncMethod

enter image description here

以下是代码:

        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");
            });
        }

1 个答案:

答案 0 :(得分:1)

  

我不明白的是这种方法的位置和方式   执行。为什么让主线程处于休眠状态并不会暂停   AsyncMethod?

此方法由CLR的托管线程池中的线程执行。如果这是真的,那么负责你的UI的应用程序中的主线程将被冻结,而它正在处理你的async方法的执行,并且UI exprerience不是最好的。

此外,这是Task.Run方法的目的。根据{{​​3}}

  

将指定的工作排队以在ThreadPool上运行并返回任务   或该任务的任务句柄。