2016-05-17 58 views
3

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

await cloudBlockBlob.DownloadToStreamAsync(writeStream); 

是这样的一行:

await blockBlob.DownloadToStreamAsync(writeStream, cancellationToken); 

后来的方法,因为我做失败没有最新版本的WindowsAzure。尽管最新版本支持第二种方法(如here所示),但我无法访问该方法,并且不能升级到最新版本。

是否有另一种方法可以用该行代码取消任务,还是强制删除此功能?

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

+0

请告诉我们您正在使用什么版本的Storage Client库(Microsoft.WindowsAzure.Storage.dll)? –

回答

2

是否有另一种方法可以用该行代码取消任务,或者我是否强制删除此功能?

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

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

一种是不取消操作(下载);相反,只需取消等待。这给你的好处是你可以假装取消操作,但请注意,操作将继续执行,就好像什么也没有发生。

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

如果该操作是同步的,则可以通过在单独的线程中运行该操作,然后在取消时中止该线程来将其加速一步。我不推荐这种方法,因为中止线程对于您的应用程序的长期健康非常不利。但是,这是ASP.NET所使用的方法,它也会偶尔回收您的应用程序,以解决这些长期健康问题。最后,如果您需要一种可靠的方法来真正取消操作而不存在中止线程的危险,那么就有核选项:将操作放在单独的进程中。杀死进程是干净的(不像中止线程),它实际上会强制取消操作。我只需要做一次;它不漂亮,但它的工作。