c# TPL中的数据竞争-Data Race
例一: Parallel.For(1, arraySize, i => { ary[i] = ary[i] + ary[i - 1]; });
如下: object _lock = new object(); Parallel.For(1, arraySize, i => { lock(_lock) ary[i] = ary[i] + ary[i - 1]; });
解决方案:lock 确保当一个线程位于代码的临界区时,另一个线程不进入临界区,如果其他线程试图进入锁定的代码,则它将一直等待,直到该对象被释放
例二:
private static readonly AsyncLocal<LocalLifeTineScopelrapper> AsynclLocallLifeScope = new AsyncLocal<LocalLifeTimeScopelrapper>(); private static ILifetimeScope GetCurrentUow() { var uow = AsyncLocalLifeScope.Value ? .LifetimeScope; if(uow == null) { return null; } return uow; }
解决如下
private static ILifetimeScope GetCurrentUow() { lock(AsynclLocallLifeScope) { var uow = AsyncLocalLifeScope.Value ? .LifetimeScope; if(uow == null) { return null; } return uow; } }