很多时候我们需要做一段延时处理,就直接Thread.Sleep(n)处理了,但实际上延时也可以用Task.Delay(n),那二者之间有没有区别呢?; N" O% o% Y2 _4 [
我们先来看一个案例:
' u9 k" H8 B; U; d# h5 U
- using System;
- using System.Threading;
- using System.Threading.Tasks;
-
- namespace ConsoleApp22
- {
- class Program
- {
- static void Main(string[] args)
- {
- //Good writing
- Task.Run(async () =>
- {
- int delayTimeCount = 0;
- while (true)
- {
- Console.WriteLine($"Delay第{++delayTimeCount}秒");
- await Task.Delay(1000);
- }
- });
-
- //Bad writing
- Task.Run(() =>
- {
- int sleepTimeCount = 0;
- while (true)
- {
- Console.WriteLine($"Thread{++sleepTimeCount}秒");
- Thread.Sleep(1000);
- }
- });
-
- Console.ReadKey();
- }
- }
- }
运行结果:
4 [# h! D* @$ d; C+ d2 m, v' c
. N! T, O0 D+ _, r区别:
0 Z2 i7 b1 }. C! }4 V①.Thread.Sleep()是同步延迟,既然是同步的,自然会阻塞当前线程;Task.Delay()是异步延迟,则不会阻塞线程;
/ X. D! H7 }. K" X②.Thread.Sleep()不能中途取消,Task.Delay()可以,delay有四个重载方法,需要取消的话,可以调用Delay(int millisecondsDelay, CancellationToken cancellationToken)这个方法;
$ j% ]* U) h6 O- l2 H- //
- // 摘要:
- // Creates a task that completes after a specified number of milliseconds.
- //
- // 参数:
- // millisecondsDelay:
- // The number of milliseconds to wait before completing the returned task, or -1
- // to wait indefinitely.
- //
- // 返回结果:
- // A task that represents the time delay.
- //
- // 异常:
- // T:System.ArgumentOutOfRangeException:
- // The millisecondsDelay argument is less than -1.
- public static Task Delay(int millisecondsDelay);
- //
- // 摘要:
- // Creates a cancellable task that completes after a specified number of milliseconds.
- //
- // 参数:
- // millisecondsDelay:
- // The number of milliseconds to wait before completing the returned task, or -1
- // to wait indefinitely.
- //
- // cancellationToken:
- // A cancellation token to observe while waiting for the task to complete.
- //
- // 返回结果:
- // A task that represents the time delay.
- //
- // 异常:
- // T:System.ArgumentOutOfRangeException:
- // The millisecondsDelay argument is less than -1.
- //
- // T:System.Threading.Tasks.TaskCanceledException:
- // The task has been canceled.
- //
- // T:System.ObjectDisposedException:
- // The provided cancellationToken has already been disposed.
- public static Task Delay(int millisecondsDelay, CancellationToken cancellationToken);
- //
- // 摘要:
- // Creates a task that completes after a specified time interval.
- //
- // 参数:
- // delay:
- // The time span to wait before completing the returned task, or TimeSpan.FromMilliseconds(-1)
- // to wait indefinitely.
- //
- // 返回结果:
- // A task that represents the time delay.
- //
- // 异常:
- // T:System.ArgumentOutOfRangeException:
- // delay represents a negative time interval other than TimeSpan.FromMilliseconds(-1).
- // -or- The delay argument's System.TimeSpan.TotalMilliseconds property is greater
- // than System.Int32.MaxValue.
- public static Task Delay(TimeSpan delay);
- //
- // 摘要:
- // Creates a cancellable task that completes after a specified time interval.
- //
- // 参数:
- // delay:
- // The time span to wait before completing the returned task, or TimeSpan.FromMilliseconds(-1)
- // to wait indefinitely.
- //
- // cancellationToken:
- // A cancellation token to observe while waiting for the task to complete.
- //
- // 返回结果:
- // A task that represents the time delay.
- //
- // 异常:
- // T:System.ArgumentOutOfRangeException:
- // delay represents a negative time interval other than TimeSpan.FromMilliseconds(-1).
- // -or- The delay argument's System.TimeSpan.TotalMilliseconds property is greater
- // than System.Int32.MaxValue.
- //
- // T:System.Threading.Tasks.TaskCanceledException:
- // The task has been canceled.
- //
- // T:System.ObjectDisposedException:
- // The provided cancellationToken has already been disposed.
- public static Task Delay(TimeSpan delay, CancellationToken cancellationToken);
|