Nancy'的CancellationToken用于异步请求处理程序来自何处,何时取消

本文关键字:程序 何处 取消 何时 请求处理 异步 用于 CancellationToken Nancy | 更新日期: 2023-09-27 17:53:52

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

基本上我想知道的是在什么条件下令牌的。iscancellationrequested设置为true -这是记录或解释的地方吗?

Nancy如何处理async处理器'never' return/in 'time'?关于"及时":是否有一个超时/限制,之后处理程序被取消?

Nancy'的CancellationToken用于异步请求处理程序来自何处,何时取消

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

CancellationToken通过IOwinRequest.CallCancelled属性直接来自Owin (Nancy源代码,此处使用)。如果请求被取消(例如,通过强制关闭HTTP连接),该令牌可以由Owin设置。

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

当你调用CancellationTokenSource。取消,从它创建的每个令牌都被标记。


有趣的事实: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

这就是取消令牌的美妙之处,您不必知道或关心它们是如何设置的。这完全取决于提供令牌的人。你只需要查看token,看看它是否被设置。

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