如何在ASP.NET应用程序中异步调用一个Web服务?

6

我需要在ASP.NET应用程序中异步调用Web服务。aspx页面不需要来自Web服务的答案。这只是一个简单的通知。

我正在使用Web服务存根中的...Async()方法和<%@Page Async="True" %>

ws.HelloWorldAsync();

我的问题是:网页请求正在等待Web服务响应。
如何解决这个问题?如何避免在Web服务宕机或过载时出现任何资源泄漏?
4个回答

1
一个Web服务代理通常也有Begin和End方法。你可以使用它们。下面的示例展示了如何调用begin方法并使用回调来完成调用。对MakeWebServiceAsynCall的调用将立即返回。using语句将确保对象被安全地处理。
void MakeWebServiceAsynCall()
    {
        WebServiceProxy proxy = new WebServiceProxy();
        proxy.BeginHelloWorld(OnCompleted, proxy);
    }
    void OnCompleted(IAsyncResult result)
    {
        try
        {
            using (WebServiceProxy proxy = (WebServiceProxy)result.AsyncState)
                proxy.EndHelloWorld(result);
        }
        catch (Exception ex)
        {
            // handle as required
        }
    }

如果您需要知道调用是否成功,您需要等待结果。

0

我以前用过简单的线程来做这个。例如:

Thread t = new Thread(delegate()
{
    ws.HelloWorld();
});
t.Start();

该方法返回后,线程将继续运行。看起来线程池的方法并不总是被推荐使用


我了解到使用线程池会干扰ASP.NET的执行。但是创建太多的线程会降低整个Web应用程序的性能。 - Jorge

0

如果您不关心获得结果通知,那么启动一个新的线程可能是最简单的解决方案。

new Thread(() => ws.HelloWorld()).Start

0
在您的情况下,您可以使用线程池ThreadPool.QueueUserWorkItem(...)来调用池化线程中的Web服务。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接