如何触发其他取消令牌?

时间:2018-05-05 04:01:53

标签: asp.net-core asp.net-core-mvc cancellationtokensource cancellation-token

我有两个控制器,一个提供下载文件的流,另一个允许删除文件。

当删除文件的请求进入时,我想中断流下载(从磁盘),以便删除该文件。

我尝试过组合取消令牌并将它们存储在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进行组合,但调用cancel似乎什么也没做。

当前方法的问题在于,当调用删除操作时,似乎存在不处理对文件的访问的情况(即使在该调用中我睡了10分钟)。如果我在一分钟左右后进行后续呼叫(没有10分钟的延迟),则可以删除该文件。关于锁定文件的内容令人困惑,我觉得取消令牌可以解决这个问题......

0 个答案:

没有答案