取消异步Web服务调用

我需要能够取消对我的webservice的异步调用。 我的一个解决方案是使用管理我自己的线程,并使用SOAP客户端的同步方法。 这工作正常,它需要一些更精细的线程管理。

如果我使用通过添加Web服务引用提供的这两种模式中的任何一种,请说:

var Client = new ASL_WS.SvcSoapClient() IAsyncResult result = Client.BeginAuthenticateUser(Email, Password, new AsyncCallback(AuthCompleted)); 

要么

 var Client = new ASL_WS.SvcSoapClient() Client.AuthenticateUserCompleted += AuthCompleted; Client.AuthenticateUserAsync(Email, Passsword); 

这两种模式中的任何一种都能给我一种取消请求的方法吗? 一个用例可能是:用户登录,但想要在身份validation调用完成之前取消。

当然,我可以通过修改传递给这些调用的asyncState并将其设置为禁用UI更新来实现这一点,但这不是我想要的。

我可以取消所有未完成的操作吗? Client.Abort()是否取消此类操作。 如果有很多异步请求会被取消怎么办? 有没有其他API方法可以做到这一点?

是的,您可以使用Abort方法,但请记住以下注意事项。 您也可以使用CancelAsync 。

Abort notes: http : //msdn.microsoft.com/en-us/library/aa480512.aspx

当您调用Abort方法时,任何未完成的请求仍将完成,但它们将完成错误。 这意味着如果您使用回调,仍会为每个未完成的请求调用您的回调函数。 当调用EndInvoke方法时,或者在我们的情况下,包装函数EndDelayedResponse,然后将生成一个错误,指示底层连接已被关闭。

CancelAsync示例: http : //www.codeproject.com/KB/cpp/wsasync.aspx