Как активировать другие токены отмены? - PullRequest
0 голосов
/ 05 мая 2018

У меня есть два контроллера, один из которых предоставляет поток для загрузки файла, а другой позволяет удалить файл.

Когда приходит запрос на удаление файла, я хочу прервать загрузку потока (с диска), чтобы файл можно было удалить.

Я попытался объединить токены отмены и сохранить их в IMemoryCache. Хотя я могу получить значение и вызвать отмену на CancellationTokenSource, он не вызывает отмену на другом контроллере.

Есть ли какой-нибудь механизм, с помощью которого я могу остановить потоковую передачу файла, чтобы удалить его?

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

Редактировать: Добавление кода:

Удалить:

var cacheEntryOptions = new MemoryCacheEntryOptions().SetPriority(CacheItemPriority.NeverRemove).SetAbsoluteExpiration(TimeSpan.FromMinutes(30));
this.MemoryCache.Set(fileId, true, cacheEntryOptions);

Здесь я думаю, что действие удаления добавит что-то в кеш, что может проверить действие потока.

Действие потока:

while (!response.HttpContext.RequestAborted.IsCancellationRequested && bytesRemaining > 0)
{
    if (this.MemoryCache.TryGetValue(this.FileId, out bool dummyValue))
    {
        throw new OperationCanceledException("Operation cancelled remotely");
    }
}

С RequestAborted Я ожидаю, что если клиент сделает собственный запрос на отмену, поток остановится (что он и делает).

Окружение while У меня есть попытка / поймать:

catch (OperationCanceledException cancelled)

Что нужно утилизировать для доступа к файлу.

Я пробовал нечто подобное с CancellationTokens и комбинировал их с помощью TokenSource, но вызов отмены, похоже, ничего не делал.

Проблема с текущим подходом заключается в том, что, по-видимому, существует ситуация, в которой доступ к файлу не предоставляется при вызове действия удаления (даже если в течение этого вызова я сплю 10 минут). Если я сделаю последующий вызов вместо этого через минуту или около того (без 10-минутной задержки), тогда файл можно будет удалить. Это сбивает с толку то, что удерживает блокировку файла, и я чувствую, что токены отмены решат проблему здесь ...

...