取消异步Web服务调用

时间:2011-10-07 14:57:19

标签: c# multithreading web-services

我需要能够取消对我的网络服务的异步调用。我的一个解决方案是使用管理我自己的线程,并使用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更新来实现这一点,但这不是我正在寻找的。

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

1 个答案:

答案 0 :(得分:6)

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

中止备注:http://msdn.microsoft.com/en-us/library/aa480512.aspx

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

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