1. 概述
本章包括同步资源以及取消长时间任务相关的内容。
2. 主要内容
2.1 同步资源
① lock关键字实现。会阻塞程序,有可能会导致死锁。
② volatile关键字可以禁用编译优化,用于避免优化代码时对多线程的影响。
private static volatile int _flag = 0;
③ Interlocked关键字可以原子化一些简单数字运算和比较替换操作。
Interlocked.Increment(ref n); // Interlocked.Decrement(ref n); // Interlocked.Exchange(ref isInUse, 1); Interlocked.CompareExchange(ref value, newValue, compareTo);
2.2 取消任务
① CancellationToken
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); CancellationToken token = cancellationTokenSource.Token; Task task = Task.Run(() => { while(!token.IsCancellationRequested) { Console.Write("*"); Thread.Sleep(1000); } }, token); Console.WriteLine("Please enter to stop the task"); Console.ReadLine(); cancellationTokenSource.Cancel();
② 使用Task.WaitAny()可以设置任务的超时时间。
Task longRunning = Task.Run(() => { Thread.Sleep(10000); }); int index = Task.WaitAny(new[] {longRunning}, 1000); if (index == -1) Console.WriteLine("Task time out ");
3. 总结
① 多线程环境访问共享数据时,要考虑避免数据的损坏和脏读。
② 使用lock关键字可以实现共享资源的多线程顺序访问。
③ 可以使用Interlocked实现简单的原子操作。
④ 可以使用CancellationTokenSource类的CancellationToken来控制取消任务。
时间: 2024-10-07 11:53:57