【发布时间】:2014-03-18 14:15:34
【问题描述】:
我们正在使用 .NET 4.5.1 开发应用程序,并在后台使用 SemaphoreSlim 实现了我自己的“异步锁”。要锁定我们使用以下方法:
public async Task<IDisposable> LockAsync(CancellationToken cancellationToken = default(CancellationToken))
{
await SyncRoot.WaitAsync(cancellationToken).ConfigureAwait(false);
return this;
}
其中SyncRoot 是new SemaphoreSlim(1) 实例。
这似乎在“生产”中运行良好,但它在以下单元测试中失败:
for (int i = 0; i < numberOfTasks; i++)
{
tasks[i] = Task.Run<Task>(async () =>
{
Interlocked.Increment(ref counterAtomicBegin);
using (await alock.LockAsync().ConfigureAwait(false))
{
counterLocked += 1;
}
Interlocked.Increment(ref counterAtomicEnd);
});
}
counterLocked 和 counterAtomicBegin 最后不相等(在 100k 个任务时,它们相差约 1k)。
是我做错了什么还是SemaphoreSlim的问题?
更新:按照建议删除嵌套逻辑并调整文本。
请参阅以下代码(可以在 LINQPad 中执行)进行测试:http://pastebin.com/WXecZxqu
【问题讨论】:
标签: c# .net asynchronous locking semaphore