我想取消下载文件的任务。我的研究表明,使用CancellationToken这应该是可行的。我遵循了here解释的指南,并且在我需要更改这行代码之前一切正常:
await cloudBlockBlob.DownloadToStreamAsync(writeStream);
就像这一行:
await blockBlob.DownloadToStreamAsync(writeStream, cancellationToken);
后一种方法失败,因为我没有最新版本的WindowsAzure。虽然最新版本支持第二种方法(如here所示),但我根本无法访问该方法,并且升级到最新版本不是一种选择。
是否有其他方法可以使用该行代码取消任务,或者我是否被迫删除此功能?
编辑:我使用的是Microsoft.WindowsAzure.Storage.dll v6.0.0.0
答案 0 :(得分:2)
您始终可以通过多种方式取消不支持API取消的任务。我通常选择的那个就在这里。注意任何副作用。
其他方式是使用带有取消逻辑的Task.Run。
答案 1 :(得分:2)
是否有其他方法可以使用该行代码取消任务,或者我是否被迫删除此功能?
您无法轻易取消无法使用的代码。无论语言,平台,操作系统或代码是异步/同步,都是如此。
如果代码本身不支持取消(如您的情况),那么您有几个选项。
一种是不取消操作(下载);相反,只需取消等待。这为您提供了假装取消操作的优势,但请注意,操作将继续执行,就像没有发生任何事情一样。
另一种选择是使用适用于大多数Windows操作的偷偷摸摸的小技巧:关闭底层句柄。这反过来通常会导致操作失败。在这种情况下,没有任何可以关闭blob的东西,但你可以尝试关闭它写入的流。
如果操作是同步的,则可以通过在单独的线程中运行操作,然后在取消时中止该线程,将其提升一级。我不推荐这种方法,因为中止线程对于应用程序的长期健康状况非常不利。但是,这是ASP.NET使用的方法,它也会偶尔回收您的应用程序,以解决这些长期的健康问题。
最后,如果您需要一种可靠的方法来真正取消操作而没有中断线程的危险,那么就有核选项:将操作放在一个单独的进程中。杀死进程是干净的(与中止线程不同),它实际上会强制取消操作。我只需要这样做一次;它不漂亮,但它奏效了。