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