如何等待Azure CloudQueue被删除?

时间:2017-10-19 19:34:28

标签: c# azure azure-storage-queues

我正在运行一些使用Azure CloudQueue的测试,而在设置/拆解时,我正在调用CreateIfNotExistsAsync()DeleteIfExistsAsync()。但是当我连续运行我的测试时,我得到了一个Microsoft.WindowsAzure.Storage.StorageException,“远程服务器返回了一个错误:(409)冲突。”

    await cloudQueue.CreateIfNotExistsAsync();
    // do work 1
    await cloudQueue.DeleteIfExistsAsync();
    await cloudQueue.CreateIfNotExistsAsync(); // throws exception
    // do work 2

在仔细查看服务器的响应后,我发现StatusDescription说“正在删除指定的队列。”

是否有一个我可以调用的方法,一旦它返回,我确定队列已经被删除了?

=============================================== ========================== 更新现在我想起来了。如果Azure Queue服务器想要回复删除结果,它将必须跟踪未完成的传入请求,这显然是不好的设计(易受DOS攻击)......

1 个答案:

答案 0 :(得分:1)

  

是否有一种我可以调用的方法,一旦它返回,我知道   确定队列已被删除?

不幸的是没有。删除队列(或blob容器/表/文件共享)是一种异步操作。当您发送删除队列的请求时,Azure存储会将该队列标记为删除(以便不能对其执行任何操作),然后通过后台进程实际删除队列。根据文档,删除队列最多可能需要30秒。但是,它可能更多地取决于那里保存了多少数据。

来自documentation

  

成功删除队列后,会立即标记队列   删除,客户无法访问。队列是   后来在垃圾收集过程中从队列服务中删除了。

可能的解决方法:

由于没有可以调用的方法会告诉您确定队列已被删除,您需要做的是尝试使用CreateIfNotExistsAsync创建队列并捕获任何错误。如果HTTP状态代码为Conflict (409)且错误代码为QueueBeingDeleted,则应等待一段时间并重试该操作。如果需要,可以在重试之间增加延迟。