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;
    }
}

 

posted @ 2022-05-25 11:34  Tammytan  阅读(31)  评论(0编辑  收藏  举报