我有一个ASP.NET webservice(.asmx),它有一个简单的方法,可以通过同步调用(ExecuteReader)从DB读取内容并返回结果。有没有办法优化线程池的使用(即通过调用异步调用(BeginExecuteReader))而不改变方法的签名?
目的是在数据库操作进行时不阻塞线程池线程;并不打算通过并行进行多项操作来加快速度。
答案 0 :(得分:3)
实际上,答案是是。请参阅Asynchronous XML Web Service Methods。
虽然使用Begin *和End *方法创建异步Web方法,但.NET只会在WSDL中创建单个操作。如果你考虑一下这是显而易见的 - Java客户端对IAsyncResult
做什么?
客户端可以同步或异步调用操作。
答案 1 :(得分: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代替,但代码变得更复杂,并且有点超出了问题的范围。
答案 2 :(得分:1)
是的,您基本上可以自由地响应服务请求。但是,如果你只有1个查询,那么它将没有多大用处。如果您需要2个或更多查询,那就很有趣了。
然后当然,你必须收集所有结果,正如Alex Lyman指出的那样。 ASP.NET WebPage对此有特殊的支持,这就是为什么我确信它是可能的。
答案 3 :(得分:-2)
我看不出这是如何工作的,当你的web服务请求进来时,如果你从那个线程然后你的请求线程进行异步调用,那么将从池中分配一个线程来处理请求结束,客户不会得到任何结果。
简短回答是否。人们似乎只是在阅读这一行并且正在低估:)用户问我们是否可以从同步webservice调用内部执行异步调用,这当然可以通过使用WaitHandles但在用户的特定情况下没有意义。