2009-04-28 130 views
0

我有一个ASP.NET web服务(.asmx)与一个简单的方法,从数据库中读取一些同步调用(ExecuteReader)并返回结果。有什么方法可以优化线程池的使用(即通过调用异步调用(BeginExecuteReader))而不改变方法的签名?有什么办法让ASP.NET webservice方法使用异步方法?

意图是在数据库操作正在进行时不阻塞线程池线程;并不是要通过并行执行多个操作来加快速度。

回答

3

其实答案是。见Asynchronous XML Web Service Methods

虽然您使用Begin *和End *方法创建异步Web方法,但.NET将仅在WSDL中创建单个操作。如果您仔细考虑,这一点很明显 - Java客户端如何处理IAsyncResult

客户端可以同步或异步调用操作。

1

是的,你基本上可以自由地做你想要的服务请求响应。但是,如果你只有一个查询,这不会有太大用处。如果你需要2个或更多的查询,它变得有趣。


然后当然你必须收集所有的结果,正如Alex Lyman指出的那样。 ASP.NET WebPage对此有特别的支持,这就是为什么我确信它是可能的。

+0

亚历克斯澄清你的答案。 – 2009-04-29 00:43:43

-2

我不明白这是如何工作的,当一个请求进入您的web服务时,将从池中分配一个线程来处理请求,如果您从该线程进行异步调用,那么您的请求线程结束,客户端不会得到任何结果。

简答案是 人们似乎只是在阅读本行并downvoting :)用户询问我们是否可以在同步webservice调用中执行异步调用,这肯定可以通过使用WaitHandles来实现,但可以在用户的特定情况下没有意义。

+0

http://msdn.microsoft.com/en-us/magazine/cc163725.aspx关于如何使用Pages进行此操作。可能无法使用网络服务,但不能说明原因。 – Aleris 2009-04-28 19:52:38

+0

我也不明白downvoting。 – 2009-04-29 00:42:25

+0

约翰桑德斯是正确的。当您创建Begin *和End *方法时,只会显示*方法。它对外界透明。 – 2009-04-29 00:58:38

2

和您提供的,用一个单一的异步调用的具体使用情况,它不会是值得的,但是,是的,你可以从一个Web服务调用异步调用:

[WebMethod] 
public SomeResult SynchronousMethod() { 
    IAsyncResult someWork = BeginSomeAsyncWork(); 
    IAsyncResult otherWork = BeginOtherAsyncWork(); 
    WaitHandle[] all = new WaitHandle[] { someWork.AsyncWaitHandle, otherWork.AsyncWaitHandle }; 
    // TODO: Do some synchronous work here, if you need to 
    WaitHandle.WaitAll(all); /* this is the important part, it waits for all of the async work to be complete */ 
    var someWorkResult = EndSomeAsyncWork(someWork); 
    var otherWorkResult = EndSomeAsyncWork(otherWork); 
    // TODO: Process the results from the async work 
    // TODO: Return data to the client 
} 

重要这里的东西是WaitHandle.WaitAll,它会阻塞,直到所有的异步工作完成。如果您可以单独处理结果,则可以使用WaitHandle.WaitAny代替,但代码变得更加复杂,并且有点超出问题的范围。