我正在使用ServiceStack v4,并发出如下异步请求:
var client = new JsonServiceClient(url);
Task reqTask = client.GetAsync(request);
我将同时向不同的服务器发出很多请求,并且需要支持取消才能立即取消所有未完成的呼叫。底层AsyncServiceClient
有一个方法CancelAsync
,但是它似乎什么也没做。
如何取消请求,使其立即中止Web请求?
短版,似乎CancelAsync确实不执行任何操作。
查看代码,似乎ServiceStack使用了旧方法(v3)异步执行请求并通过回调通知您,这些回调均基于WebRequest和APM样式调用(BeginXXX,EndXXX)构建。的GetAsync
,SendAsync
方法实际上是使用TaskCompletionSource包装提供了实际的异步操作基于任务的界面。
CancelAsync实际上会调用JsonServiceClient层次结构中的类未设置的CancelAsyncFn委托,因此调用它实际上没有任何作用。我怀疑提供了用于创建自定义客户端和操作的信息。
无论如何,取消HTTP请求听起来并不容易。您需要了解要取消的内容。
查看代码,看来您无法执行#4,#5或#6,因为AsyncServiceClient不会公开内部使用的IAsyncResult。您唯一可以做的就是忽略响应,并付出反序列化的代价。注意,如果您使用HttpClient的GetStringAsync方法而不是执行每个步骤,则同样适用。
因此,如果cancel
意味着放弃请求,则可以通过简单地忽略返回值来实现。如果这意味着stop server processing
,则不能。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句