我有一个ASP.NET web服务(.asmx)与一个简单的方法,从数据库中读取一些同步调用(ExecuteReader)并返回结果。有什么方法可以优化线程池的使用(即通过调用异步调用(BeginExecuteReader))而不改变方法的签名?有什么办法让ASP.NET webservice方法使用异步方法?
意图是在数据库操作正在进行时不阻塞线程池线程;并不是要通过并行执行多个操作来加快速度。
我有一个ASP.NET web服务(.asmx)与一个简单的方法,从数据库中读取一些同步调用(ExecuteReader)并返回结果。有什么方法可以优化线程池的使用(即通过调用异步调用(BeginExecuteReader))而不改变方法的签名?有什么办法让ASP.NET webservice方法使用异步方法?
意图是在数据库操作正在进行时不阻塞线程池线程;并不是要通过并行执行多个操作来加快速度。
其实答案是是。见Asynchronous XML Web Service Methods。
虽然您使用Begin *和End *方法创建异步Web方法,但.NET将仅在WSDL中创建单个操作。如果您仔细考虑,这一点很明显 - Java客户端如何处理IAsyncResult
?
客户端可以同步或异步调用操作。
是的,你基本上可以自由地做你想要的服务请求响应。但是,如果你只有一个查询,这不会有太大用处。如果你需要2个或更多的查询,它变得有趣。
然后当然你必须收集所有的结果,正如Alex Lyman指出的那样。 ASP.NET WebPage对此有特别的支持,这就是为什么我确信它是可能的。
我不明白这是如何工作的,当一个请求进入您的web服务时,将从池中分配一个线程来处理请求,如果您从该线程进行异步调用,那么您的请求线程结束,客户端不会得到任何结果。
简答案是
人们似乎只是在阅读本行并downvoting :)用户询问我们是否可以在同步webservice调用中执行异步调用,这肯定可以通过使用WaitHandles来实现,但可以在用户的特定情况下没有意义。
http://msdn.microsoft.com/en-us/magazine/cc163725.aspx关于如何使用Pages进行此操作。可能无法使用网络服务,但不能说明原因。 – Aleris 2009-04-28 19:52:38
我也不明白downvoting。 – 2009-04-29 00:42:25
约翰桑德斯是正确的。当您创建Begin *和End *方法时,只会显示*方法。它对外界透明。 – 2009-04-29 00:58:38
和您提供的,用一个单一的异步调用的具体使用情况,它不会是值得的,但是,是的,你可以从一个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代替,但代码变得更加复杂,并且有点超出问题的范围。
亚历克斯澄清你的答案。 – 2009-04-29 00:43:43