2011-10-07 188 views
2

我需要能够取消对我的Web服务进行异步调用。我拥有的一个解决方案是使用管理自己的线程,并使用来自SOAP客户端的同步方法。这工作正常,它需要一些更细粒度的线程管理。取消异步Web服务调用

如果我使用任何从添加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方法可以做到这一点?

回答

6

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

中止笔记:http://msdn.microsoft.com/en-us/library/aa480512.aspx

当你调用中止方法,任何悬而未决的请求仍将完成,但他们将与故障完成。这意味着如果您使用回调函数,您的回调函数仍将针对每个未完成的请求调用。当调用EndInvoke方法时,或者在我们的例子中,包装函数EndDelayedResponse,则会生成一个错误,指示底层连接已关闭。

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

+1

有道理。我花了一段时间才弄清楚代码在做什么,但现在很明显。我最终做了类似的事情。谢谢。 – Candide