Nancy的CancellationToken来自异步请求处理程序来自何时取消?

时间:2015-06-05 20:14:25

标签: c# asp.net asynchronous async-await nancy

这是一个关于理解Nancy如何以及何时可以通过提供的cancellationToken实例取消异步请求处理程序的问题。

基本上我想知道的是在什么条件下令牌的.IsCancellationRequested设置为true - 这是记录还是在某处解释?

Nancy如何处理'永不'返回/'时间'的异步处理程序?关于'及时':是否存在超时/限制,之后处理程序会被取消?

3 个答案:

答案 0 :(得分:3)

我知道这是一个老问题,但我处于同样的情况,我认为至少如果你使用Owin托管你的应用程序(使用Nancy.Owin)我找到了答案。

CancellationToken通过IOwinRequest.CallCancelled属性(Nancy source codeused here直接来自Owin。如果取消请求(例如通过强制关闭HTTP连接),可以由Owin设置此令牌。

答案 1 :(得分:1)

每个CancellationToken都来自某个地方,而某个地方就是它的CancellationTokenSource。

当您调用CancellationTokenSource.Cancel时,会标记从其创建的每个标记。

有趣的事实:CancellationToken是一个结构,这意味着每次将它传递给函数或将其分配给变量时,它都会生成一个新副本。由于来源无法跟踪所有这些副本,因此我们无法获得CancellationToken.IWasCancelled事件。相反,当您调用IsCancellationRequested时,令牌必须询问其来源。

参考:https://msdn.microsoft.com/en-us/library/system.threading.cancellationtokensource(v=vs.110).aspx

回到Nancy,搜索他们的CancellationTokenSource源代码,你就会找到答案。这是我见过的唯一一个。

https://github.com/NancyFx/Nancy/blob/8a29b0495bfac4806536327c4d78de1ee59bd513/src/Nancy/NancyEngine.cs

答案 2 :(得分:0)

取消令牌的美妙之处在于,您不必知道或关心如何设置。这完全取决于向您提供令牌的人。您只需查看令牌并查看它是否已设置。

如果您正在调用接受CancellationToken的方法,并且您想知道如何创建可以随时设置的方法,那么您应该使用CancellationTokenSource来创建一个象征;您可以使用CTS取消它生成的令牌,或将其设置为在一段时间后取消。