【问题标题】:ASP.NET true asynchronous operationASP.NET 真正的异步操作
【发布时间】:2011-10-04 11:30:34
【问题描述】:

我正在尝试从 ASP.NET 页面触发多个 HTTP 请求。页面本身不需要知道响应,并且无论如何都应该继续处理和交付页面。

我尝试将 HTTP 代码放入 BackgroundWorker 并异步运行,但我最初收到以下错误;

在这种情况下不允许异步操作。页面起始 异步操作必须将 Async 属性设置为 true 并且异步操作只能在之前的页面上启动 PreRenderComplete 事件。

所以我按照我的指示做了,并为页面赋予了 Async 属性。然后我做了一些研究,发现我的 BackgroundWorker 实际上并没有像我预期的那样执行异步操作。一些背景资料 (http://www.pluralsight-training.net/community/blogs/mike/archive/2005/11/04/16213.aspx) 告诉我;

PreRender 和 PreRenderComplete 事件 [do] 直到所有 所有已注册异步任务的超时事件处理程序都有 被调用并返回。

如何确保我的 BackgroundWorker 不会暂停页面的处理?

【问题讨论】:

    标签: c# asp.net .net multithreading


    【解决方案1】:

    要查看的另一个选项是 ThreadPool.QueueUserWorkitem()。它会异步触发某些东西。它还将使用 asp.net 线程池中的一个线程。

    我通常在服务器上使用 threadPool,在 gui/winforms 中使用 BackGroundWorker。这并不是说做不到。

    如果您被 BackgroundWorker 卡住了,至少可以尝试其他方法...

    这里有一些其他的 SO 帖子:

    ThreadPool.QueueUserWorkItem uses ASP.Net

    ThreadPool.QueueUserWorkItem with a lambda expression and anonymous method

    ThreadPool.QueueUserWorkItem with function argument

    【讨论】:

    • 谢谢,QueueUserWorkItem() 是我要找的。我做的唯一线程是 GUI 的东西,所以我习惯于使用 BackgroundWorker。我还发现了一篇很好的小文章,让整个事情变得更整洁using anonymous types
    【解决方案2】:

    在 ASP.NET 中执行真正异步操作的新方法是使用 PageAsyncTask class.(MSDN 文档中有一些示例代码)

    另外,我推荐您来自 Thomas Marquardt 的 read this post。最有趣的是:

    好的,所以你有充分的理由异步执行一些工作, 你应该怎么做?首先,您可以使用的所有代码 在请求执行期间运行必须在模块内运行或 处理程序。没有其他选择。如果您想执行工作 异步——真正异步,就像当前线程展开一样 并且请求的执行仅在您的工作时恢复 完成——那么你必须在一个模块或处理程序中运行 异步。如果您不想实现自己的异步 模块或处理程序,你很幸运,因为 ASP.NET 2.0 引入了 async pages ,一个建立在 IHttpAsyncHandler 之上的特性 很容易运行称为 PageAsyncTasks 的异步任务。

    如果选择不使用PageAsyncTask 类,他还提供了执行异步操作的代码示例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-16
      • 2017-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多