这是一个关于理解Nancy如何以及何时可以通过提供的cancellationToken实例取消异步请求处理程序的问题。
基本上我想知道的是在什么条件下令牌的.IsCancellationRequested设置为true - 这是记录还是在某处解释?
Nancy如何处理'永不'返回/'时间'的异步处理程序?关于'及时':是否存在超时/限制,之后处理程序会被取消?
答案 0 :(得分:3)
我知道这是一个老问题,但我处于同样的情况,我认为至少如果你使用Owin托管你的应用程序(使用Nancy.Owin
)我找到了答案。
CancellationToken
通过IOwinRequest.CallCancelled
属性(Nancy source code和used 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源代码,你就会找到答案。这是我见过的唯一一个。
答案 2 :(得分:0)
取消令牌的美妙之处在于,您不必知道或关心如何设置。这完全取决于向您提供令牌的人。您只需查看令牌并查看它是否已设置。
如果您正在调用接受CancellationToken
的方法,并且您想知道如何创建可以随时设置的方法,那么您应该使用CancellationTokenSource
来创建一个象征;您可以使用CTS取消它生成的令牌,或将其设置为在一段时间后取消。