c# - 需要 CancellationToken 的替代品

标签 c# azure

我想取消下载文件的任务。我的研究表明,这应该可以通过使用 CancellationToken 来实现。我已遵循 here 解释的指南并使一切正常工作,直到我需要更改这行代码:

await cloudBlockBlob.DownloadToStreamAsync(writeStream);

就像这一行:

await blockBlob.DownloadToStreamAsync(writeStream, cancellationToken);

后一种方法失败,因为我没有最新版本的 WindowsAzure。虽然最新版本支持第二种方法(如 here 所示),但我根本无法访问该方法,并且无法升级到最新版本。

是否有其他方法可以使用该行代码取消任务,或者我是否被迫放弃此功能?

编辑:我正在使用 Microsoft.WindowsAzure.Storage.dll v6.0.0.0

最佳答案

Is there another way to cancel a Task with that line of code, or am I forced to drop this feature?

您无法轻易取消不可取消的代码。无论语言、平台、操作系统或代码是否异步/同步,都是如此。

如果代码本身不支持取消(如您的情况),那么您有几个选择。

一是不取消操作(下载);相反,只需取消等待即可。这给您带来的好处是,您可以假装取消该操作,但要注意该操作将继续执行,就像什么都没发生一样。

另一个选择是使用适用于大多数 Windows 操作的偷偷摸摸的小技巧:关闭底层句柄。这通常会导致操作失败。在这种情况下,没有任何可以关闭的与 blob 相关的内容,但您可以尝试关闭它正在写入的流。

如果操作是同步的,您可以通过在单独的线程中运行该操作,然后在取消时中止该线程来将其提高一个档次。我不推荐这种方法,因为中止线程对应用程序的长期健康非常不利。然而,这是 ASP.NET 使用的方法,它偶尔也会回收您的应用程序,只是为了解决这些长期的健康问题。

最后,如果您需要一种可靠的方法来真正取消操作而不存在中止线程的危险,那么有一个核心选​​项:将操作放在单独的进程中。终止进程是干净的(与中止线程不同),并且它实际上会强制取消操作。我只需要这样做一次;虽然不太漂亮,但是很有效。

关于c# - 需要 CancellationToken 的替代品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37285501/

相关文章:

c# - :'Unable to connect to any of the specified MySQL hosts.' 错误

c# - 如何处理 JSON 和变体对象?

c# - 有什么方法可以创建查询,包括投影中的函数和 sqlkata 中的外部应用?

c# - 给定两个整数的方法返回最接近 1000 的值

azure - 创建 Azure 服务总线命名空间

c# - RejectChanges 特定实体

reactjs - Azure Active Directory - 如何为我在租户下注册的应用程序提供 http redirectUri

azure - 在 Azure 上强制使用 HTTPS 并附加 URL

python - 无法将较大的 blob 上传到 Azure : azure. core.exceptions.ServiceRequestError : The operation did not complete (write) (_ssl. c:2317)

asp.net - 在 Azure SQL 上打开 DataReader 错误,但在 SQL Server 2014 上却没有