如何等待Azure CloudQueue被删除?

3
我正在运行一些使用 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个回答

2
有没有一种方法可以调用,以便在它返回后,我确定队列已被删除?
很遗憾,没有。删除队列(或blob容器/表/文件共享)是一项异步操作。当您发送一个请求来删除队列时,Azure存储会将该队列标记为删除(这样就不能对其执行任何操作),然后通过后台进程实际删除该队列。根据文档,删除队列可能需要多达30秒。但是,这取决于其中保存了多少数据。
从文档中可以看到:
成功删除队列时,队列立即被标记为删除,并且不再对客户端可用。稍后在垃圾回收期间从队列服务中删除队列。
可能的解决方法:
由于没有一种方法可以调用来确保队列已被删除,因此你需要尝试使用CreateIfNotExistsAsync创建队列并捕获任何错误。如果HTTP状态代码为Conflict (409)且错误代码为QueueBeingDeleted,则应等待一段时间并重试操作。如果愿意,可以在重试之间设置递增延迟。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接