程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 編程解疑 >> task await delay-await Task.Delay(1000)和Task.Delay(1000).Wait()

task await delay-await Task.Delay(1000)和Task.Delay(1000).Wait()

編輯:編程解疑
await Task.Delay(1000)和Task.Delay(1000).Wait()

經測試對比,兩種延時策略有以下區別:
若采用await Task.Delay(1000);的延時策略,Task.Status第一遍循環中為Running,以後的循環中全部為RanToCompletion,退出循環後仍然為RanToCompletion;
若采用Task.Delay(1000).Wait();的策略,循環中Task.Status一直為Running,退出循環即為RanToCompletion。

請問:為什麼是這樣?從測試結果看采用Task.Delay(1000).Wait()似乎更合理,但大家在實際應用中似乎更多使用await Task.Delay(1000),包括MSDN上的例子。

CancellationTokenSource cts = new CancellationTokenSource();
Task taskT;

private void button1_Click(object sender, EventArgs e)
        {
            taskT = Task.Factory.StartNew(() => t(cts.Token), cts.Token);
        }

 private async Task t(CancellationToken token)
        {
            Console.WriteLine("taskT.Status2:{0}", taskT.Status);
            while (true)
            {
                Console.WriteLine();
                if (token.IsCancellationRequested)
                {
                    Console.WriteLine("線程被終止!");
                    break;
                }
                Console.WriteLine(DateTime.Now.ToString());

                Console.WriteLine("taskT.Status3:{0}", taskT.Status);
                //await Task.Delay(3000);
                Task.Delay(3000).Wait();
                //taskT.Wait(3000);

                Console.WriteLine("taskT.Status4:{0}", taskT.Status);
            }
            Console.WriteLine("taskT.Status5:{0}", taskT.Status);
        }

最佳回答:


經測試對比,問題出在Task.Delay語句,修改為:Thread.Sleep就一切OK了,不需要await修飾或.wait()。這樣,循環中的Task.Status一直為Running,退出循環即為RanToCompletion。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved