在我的团队的应用程序中发现了以下行为:
多个线程尝试使用以下行在同一blob上获取租约:
try {
Get-ChildItem $FPF -ErrorAction Stop
} catch [System.Management.Automation.ItemNotFoundException] { # input path not found
Write-Error "Not found: $FPF"
} catch { # any other error
Throw "An unexpected error occurred: $_"
}
多个线程成功获得了租约,每个线程在大约同一时间获得了不同的租约。 这是因为AcquireLeaseAsync是NOT thread-safe对吗? 我以为租约是一种锁,因此一次只能授予一个线程?
我们试图添加一个租赁ID为null的访问条件,这似乎很有帮助。
await blob.AcquireLeaseAsync(TimeSpan.FromSeconds(lockTime), null, null, new BlobRequestOptions() { RetryPolicy = RetryPolicy }, null);
但是不确定它是否万无一失,即尝试获取Blob上的租约时是否有多个线程可以通过此访问条件?
下面是我用来生成此问题的代码:
await blob.AcquireLeaseAsync(TimeSpan.FromSeconds(lockTime), null, new AccessCondition { LeaseId = null}, new BlobRequestOptions() { RetryPolicy = RetryPolicy }, null);
示例输出:
成功在线程86上获得了租约,租约ID dfbd393e-46e2-49dc-98f4-853356fbc255,时间为11/10/2018 2:16:57 AM
在线程22上成功获得的租约,租约ID f81b3dbf-68f6-401d-b82e-a1c19fb3527c,时间是11/10/2018 2:16:57 AM
在线程54上成功获得了租约,租约ID 6c05c2ee-c5a5-4d4e-83a9-b65688fca6df,时间为11/10/2018 2:16:57 AM
答案 0 :(得分:0)
将var id = blob.AcquireLeaseAsync
更改为var id = await blob.AcquireLeaseAsync