【问题标题】:Calling WCF in async manner from ASP.Net will return worker thread to thread pool of ASP.Net?从 ASP.Net 以异步方式调用 WCF 会将工作线程返回到 ASP.Net 的线程池?
【发布时间】:2012-12-10 11:25:00
【问题描述】:

我正在尝试使我的 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
    }

【问题讨论】:

  • 您使用的是异步 ASP.NET 页面吗?你能从你的页面显示一些代码吗?
  • Ladislav - 我在原帖的编辑 1 下发布了我的代码。

标签: asp.net wcf asynchronous


【解决方案1】:

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

您应该阅读我对this question 的回答。类似于你的问题。

简而言之:要实现您想要的,您必须使用异步网页。 如果您使用的是 .Net 4.5,您应该在 this article 抢劫。

【讨论】:

  • Grzegorz - 我根据下面的回答发现,即使 Page 的 Async =“false”,回调方法仍然在不同的线程上被调用。因此,当页面不是异步时,我仍然可以获得线程返回的好处。
  • 当然。但是,如果您想向请求的客户显示结果,这种方法是没有用的。除非您不这样做并且您想通过电子邮件发送您的产品列表或完全用它做其他事情。然后确定。您将从这种方法中受益。一切都取决于您想要的设计。
  • Grzegorz -我发现即使在使用异步页面时,在异步操作进行时 html 也不会发送到浏览器。所以页面仍在处理中,我们只能在异步操作结束时向用户显示。我在笔记本电脑上试过这个。异步页面只是为了提供更好的可扩展性,仅此而已。
【解决方案2】:

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

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

因此得出结论似乎是合乎逻辑的,原来的 ASP.Net 工作线程正在返回到线程池,并且正在使用线程池中的一个新线程进行回调。

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

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

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

【讨论】:

  • 有人,请将此帖子也标记为答案,因为我认为我的帖子和 Grzegorz 帖子都是有效答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-21
  • 2013-11-15
  • 2012-07-16
  • 1970-01-01
相关资源
最近更新 更多