2016-05-17 5 views
3

Я хочу отменить задачу, загружающую файл. В моих исследованиях говорится, что это должно быть выполнимо с использованием CancellationToken. Я следовал директивы объяснил here и сделал все работало, пока я не нужно, чтобы изменить эту строку кода:Нужна альтернатива CancellationToken

await cloudBlockBlob.DownloadToStreamAsync(writeStream); 

быть похожим на этой линии:

await blockBlob.DownloadToStreamAsync(writeStream, cancellationToken); 

Позднее метод не потому, что я делаю не имеют последней версии WindowsAzure. Хотя самая последняя версия поддерживает этот второй метод (как видно here), у меня просто нет доступа к этому методу, и обновление до самой последней версии НЕ является опцией.

Есть ли другой способ отменить задание с этой строкой кода, или я вынужден отказаться от этой функции?

Edit: Я использую Microsoft.WindowsAzure.Storage.dll v6.0.0.0

+0

Скажите, пожалуйста, какую версию библиотеки клиентского хранилища (Microsoft.WindowsAzure.Storage.dll) вы используете? –

ответ

2

Есть ли другой способ отменить задание с этой строкой кода, или я вынужден отказаться от этой функции?

Вы не можете легко отменить несогласованный код. Это верно независимо от языка, платформы, ОС или того, является ли код асинхронным/синхронным.

Если код не поддерживает отмену (как в вашем случае), то у вас есть несколько вариантов.

Один из них заключается в том, чтобы не отменить операцию (скачать); скорее, просто отмените wait. Это дает вам преимущество, что вы можете сделать вид, чтобы отменить операцию, но имейте в виду, что операция будет продолжаться, как будто ничего не произошло.

Другим вариантом является использование подлый маленький трюк, который работает для большинства операций Windows: закройте базовый дескриптор. Это, в свою очередь, обычно приводит к сбою операции. В этом случае нет ничего, что можно закрыть, связанное с блобом, но вы можете попытаться закрыть поток, в который он пишет.

Если операция синхронна, вы можете выполнить ее надрез, запустив операцию в отдельном потоке, а затем прервите этот поток при отмене. Я не рекомендую этот подход, так как прерывание потоков очень плохо для долгосрочного здоровья вашего приложения. Тем не менее, это подход, используемый ASP.NET, который также будет периодически перерабатывать ваше приложение, чтобы исправить эти долгосрочные проблемы со здоровьем.

Наконец, если вам нужен надежный способ по-настоящему отменить операцию без опасности прерывания потоков, существует ядерная опция: поместите операцию в отдельный процесс. Убивание процесс является чистым (в отличие от прерывистых потоков), и он фактически заставит операцию отменить. Мне нужно было сделать это только один раз; это было некрасиво, но это сработало.

1

Вы всегда можете отменить задание, которое не поддерживает отмену в API в нескольких направлениях. Я обычно выбираю здесь. Обратите внимание на любые побочные эффекты.

http://blogs.msdn.com/b/pfxteam/archive/2012/10/05/how-do-i-cancel-non-cancelable-async-operations.aspx

Другой способ заключается в использовании Task.Run с отмены логики в нем.

+0

Чтобы процитировать этот источник: «Запрос о том, что сама операция async cancel cancel ... включена, передается CancellationToken для рассматриваемой операции async». Который, кажется, полагается на мой недостающий метод. –

Смежные вопросы