2

我正在尝试使我的 ASP.Net 网站更具可扩展性,但不确定接收 Web 请求的 ASP.Net 线程是否在对 WCF 方法的异步调用完成之前返回到线程池,或者该线程将等待异步调用完成。

对 WCF 方法的异步调用大约需要 20 到 40 秒才能完成。

编辑 1:我的代码如下,用于我调用异步 WCF 方法的页面代码隐藏。WCF 方法在 WCF 端是异步的,并且它也在此页面代码隐藏中以异步方式调用。

    protected void Page_Load(object sender, EventArgs e)
    {
        using (ABCService.ServiceClient sc = new ABCService.ServiceClient())
        {
           // List<ABCService.Product> products = sc.GetDocSummary("Vend1", null, false);//this is synchronous call from client
          sc.BeginGetProducts("Vend1",GetProductsCallback, sc);//this is asynchronous call from WCF
        }
    }

    protected void GetProductsCallback(IAsyncResult asyncResult)
    {
        List<ABCService.Product> products = ((ABCService.ServiceClient)asyncResult.AsyncState).EndGetProducts(asyncResult); //this will call the WCF EndGetProducts method
    }
4

2 回答 2

1

是的,您的线程将返回到线程池,因为您的请求将在sc.BeginGetProducts. 方法GetProductsCallback在处理请求时不会有输入。

你应该阅读我对这个问题的回答。它类似于您的问题。

简而言之:要实现您想要的,您必须使用异步网页。如果您使用的是 .Net 4.5,您应该阅读这篇文章

于 2012-12-25T22:01:32.467 回答
1

我找到了下面详细解释的答案。

我发现 System.Threading.Thread.CurrentThread.ManagedThreadId 给出的 threadid 对于 'sc.BeginGetProducts' 方法与方法 'GetProductsCallback' 的 threadid 不同。

因此,似乎可以得出这样的结论:原来的 ASP.Net 工作线程被返回到线程池,并且线程池中的一个新线程被用于回调。

但是,即使原始线程返回到线程池,这并不意味着页面将在浏览器端呈现。只有在回调方法被执行后,页面才会呈现。

我最初认为页面将在进行异步调用之后但在调用回调方法之前呈现在浏览器端,因为在异步 WCF 调用的情况下 UI 不应阻塞。在这里,更合适的说法是“从 ASP.Net 应用程序进行异步 WCF 调用时工作线程(而不是 UI)是非阻塞的”。

我发现的另一个有趣的特性是,即使页面不是异步的,即页面指令中的 Async="false",我仍然看到两个不同的线程 ID 用于回调方法和原始 WCF 调用。因此,我们仍然可以获得在普通非异步页面中使用异步 WCF 方法的非阻塞优势。

于 2012-12-25T22:02:37.673 回答