所有的任务可能会共享同一个变量,所以输出结果可能会一样。将变量i赋给局部变量temp,使得每一个任务使用不同的i值。异步输出文本内容,所以在未使用完StreamReader的时候,变量sr已经离开它的作用域,调用Dispose方法。建议调用Dispose,但不调用也不是一个严重的错误。注意在Task任务处于某些状态时是不允许释放资源的,否则会报错。假设tsak1和task2都在获得第二个锁之前成功获得了第一个锁,就会发生死锁。多次运行可得下面两种结果:第一个图是未发生死锁的情形,第二个图是发生死锁的情形。Task没有提供Abort方法,使用新的TPL,不会想到这个问题,一般使用CancellationToken来控制取消任务。反复运行,可观察到不一样的结果,下图所示。

.Net多线程编程(误用点分析)

.Net多线程编程(误用点分析)

.Net多线程编程(误用点分析)

.Net多线程编程(误用点分析)

.Net多线程编程(误用点分析)