我需要能够取消对我的网络服务的异步调用。我的一个解决方案是使用管理我自己的线程,并使用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);
这两种模式中的任何一种都能给我一种取消请求的方法吗?一个用例可能是:用户登录,但想要在身份验证调用完成之前取消。
当然,我可以通过修改传递给这些调用的asyncState并将其设置为禁用UI更新来实现这一点,但这不是我正在寻找的。 p>
我可以取消所有未完成的操作吗? Client.Abort()是否取消此类操作。如果有很多异步请求会被取消怎么办?有没有其他API方法可以做到这一点?
答案 0 :(得分:6)
是的,您可以使用中止方法,但请记住以下注意事项。您也可以使用CancelAsync。
中止备注:http://msdn.microsoft.com/en-us/library/aa480512.aspx
当您调用 Abort 方法时,任何未完成的请求仍将完成,但它们将以错误完成。这意味着如果您使用回调,则仍会为每个未完成的请求调用您的回调函数。当调用 EndInvoke 方法时,或者在我们的情况下,包装函数EndDelayedResponse,将生成一个错误,指示底层连接已被关闭。
CancelAsync 示例:http://www.codeproject.com/KB/cpp/wsasync.aspx