取消异步Web服务调用

Can*_*ide 2 c# multithreading web-services

我需要能够取消对我的webservice的异步调用.我的一个解决方案是使用管理我自己的线程,并使用SOAP客户端的同步方法.这很好,它需要一些更细粒度的线程管理.

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

var Client = new ASL_WS.SvcSoapClient()
IAsyncResult result = Client.BeginAuthenticateUser(Email, Password, new AsyncCallback(AuthCompleted));
Run Code Online (Sandbox Code Playgroud)

要么

var Client = new ASL_WS.SvcSoapClient()
Client.AuthenticateUserCompleted += AuthCompleted;
Client.AuthenticateUserAsync(Email, Passsword);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Pri*_*ank 6

是的,您可以使用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