ASP.NET Web服务方法有什么办法可以使用异步方法吗?

时间:2009-04-28 18:03:18

标签: .net asp.net web-services asynchronous

我有一个ASP.NET webservice(.asmx),它有一个简单的方法,可以通过同步调用(ExecuteReader)从DB读取内容并返回结果。有没有办法优化线程池的使用(即通过调用异步调用(BeginExecuteReader))而不改变方法的签名?

目的是在数据库操作进行时不阻塞线程池线程;并不打算通过并行进行多项操作来加快速度。

4 个答案:

答案 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但在用户的特定情况下没有意义。