- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我们正在使用 .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
最佳答案
你的逻辑不正确。
异步锁不是线程仿射的,所以线程持有锁的整个概念是不正确的。相反,代码 的特定部分持有锁,并且该代码的部分可能在不同的线程上执行。
在我看来,recursive locks are a bad idea (链接是我的详细博客文章)。理论上可以编写递归异步锁(我知道的唯一实现是 part of the test suite for my AsyncEx library ),但它只能在 .NET 4.5 完整框架上运行,我仍然认为这不是一个好主意。
关于c# - SemaphoreSlim 在极端条件下无法正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22482042/
SELECT DISTINCT `A/C#` AS `A/C#`, `MyRef` AS `MyRef`, DATEDIFF('2017-06-30', `Date`) AS
我是一名优秀的程序员,十分优秀!