很多时候我们需要做一段延时处理,就直接Thread.Sleep(n)处理了,但实际上延时也可以用Task.Delay(n),那二者之间有没有区别呢?; p( d$ z8 {! k4 x
我们先来看一个案例:0 x8 u4 `: Q# |$ p$ k
- 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();
- }
- }
- }
运行结果:
0 U4 u7 h, }, r+ D. p& f8 G
0 O- x( g& V8 W4 ?* ]
区别:- T* u; D) m/ H* l6 Y1 @, k! R/ U3 Y
①.Thread.Sleep()是同步延迟,既然是同步的,自然会阻塞当前线程;Task.Delay()是异步延迟,则不会阻塞线程;" c* d* T1 o( f. t( z
②.Thread.Sleep()不能中途取消,Task.Delay()可以,delay有四个重载方法,需要取消的话,可以调用Delay(int millisecondsDelay, CancellationToken cancellationToken)这个方法;
' Z! T7 {8 U# R2 P2 n& G4 L- //
- // 摘要:
- // 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);
|