一、不要用 sleep()
想要在异步方法中暂停一段时间,不要用 thread.Sleep 因为它阻塞的是当前的线程,会阻塞调用线程,可能会把主线程阻塞。要用 await Task.Delay() 。
sleep() 会降低并发,用点餐举例子。如果用 sleep() 的话相当于服务员不工作了,而 await Task.Delay() 相当于客人休息暂停动作。
二、CancellationToken
有时候需要提前终止任务,比如请求超时、用户取消请求等情况。很多异步方法都有cancellation 参数,用于获得提前终止执行的信号。
- CancellationToken结构体
none:空结构体不可以为 null ,所以提供了个特殊的成员 none。
bool IsCancellationRequested 是否取消发出了取消任务的请求。
(了解一下)Register(Action callback) 注册取消监听
ThrowIfCancellationRequested() 如果任务被取消,执行到这段话就抛异常。
通过 CancellationTokenSource 这个类来创建 CancellationToken 结构体,一般不自己手动 new 结构体,一般通过 CancellationTokenSource 来创建 CancellationToken 对象。
CancelAfter() 指超过多少时间后自动取消发送信号。
Cancel() 手动发送取消信号。
想提前终止:
这种方式需要我们去响应取消这个步骤,这个就是响应取消的步骤。
还可以这么写,如果请求被取消了,来抛一个异常: