同时在同一天蓝色斑点上获取租约

时间:2018-11-10 02:49:21

标签: c# multithreading azure azure-storage-blobs

在我的团队的应用程序中发现了以下行为:

多个线程尝试使用以下行在同一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

1 个答案:

答案 0 :(得分:0)

var id = blob.AcquireLeaseAsync更改为var id = await blob.AcquireLeaseAsync