【问题标题】:ThreadPool.QueueUserWorkItem completed event?ThreadPool.QueueUserWorkItem 完成事件?
【发布时间】:2009-11-15 20:26:24
【问题描述】:

当用户单击按钮时,我使用ThreadPool.QueueUserWorkItem 生成一个线程,该线程启动一个长时间运行的进程。我想在线程完成后使一个按钮可见,以便用户可以单击它。

ThreadPool有没有完成的活动

我想做什么?

其中一个页面在单击时有一个按钮连接到一个 WS 并启动一个创建文件的长时间运行的进程。在处理期间,我想向用户显示一个进度条。处理完成后,我想提供一个指向已创建文件的链接。许多用户会同时单击创建不同文件的按钮。我猜你会称之为可以使用异步方法实现的单个请求?

关于异步页面的快速问答:

  1. MSDN 链接代码如下:

    AddOnPreRenderCompleteAsync ( 新的 BeginEventHandler(MyBeginMethod), 新的 EndEventHandler (MyEndMethod) );

看来MyBeginMethod 是在页面加载时启动的,如果我想在单击按钮时启动异步进程,相同的代码 sn-p 对我有用吗?

  1. 我能否在 MyBeginMethodMyEndMethod 方法中访问 UI 控件(以便在进程完成时显示下载文件按钮?或者其他线程是否拥有这些控件?

【问题讨论】:

  • 更新了答案。另外,我会跳过异步页面。对于新开发人员来说,异步页面模式非常令人困惑(我已经六年了,它仍然让我感到困惑!)。检查我的答案以获得好的解决方案。

标签: .net asp.net multithreading


【解决方案1】:

没有。

您必须将已完成的事实存储在 ASP.NET 页面可用的位置以及执行工作的方法,例如 HttpCache。

如果这一切都发生在一个请求中,请跳过线程池并查看asynchronous pages.


首先,如果文件是按用户创建的,那么长时间运行的操作的结果应该存储在 Session 中,而不是缓存中。缓存在用户之间共享,会话是每个用户的。

长时间运行的任务可以创建文件,然后将文件路径存储在该用户的会话中。每当用户再次发送对该文件的请求时,都会检查该文件的会话。

在此期间,用户界面有几个选项。一种是回发到服务器,另一种是 ajax 调用。

Ajax 可能不是最简单的,尽管网上有很多框架(如 jQuery)和大量关于如何进行异步回发的信息。如果这个过程很长,用户可能会浏览,等等,使你的任务更难实现。

另一种选择是对文件提出请求,然后重定向到保留页面。这个持有页面有一个脚本,每 X 秒自动刷新一次。它向用户显示一条通知,例如“请稍候,正在创建您的文件”。每次此页面回发到服务器时,都会检查文件是否存在。如果它还没有准备好,那么您将返回到保留页面。最终,文件准备就绪,您可以将用户重定向到下载/显示/其他文件的另一个页面。

第二个选项对您来说可能更容易、更直接地实施。这是伪代码:

  1. 用户点击链接获取文件
  2. 在回发时,服务器重定向到保留页面
  3. 用户的浏览器被重定向到保留页面
  4. 请求由保留页面处理。为文件检查会话。
    1. 如果会话报告该文件尚未创建且未创建,则启动文件创建过程。保留页面返回给用户。
    2. 如果会话报告正在创建文件,则将保留页面返回给用户。
    3. 如果会话报告文件已生成,用户将被重定向到下载页面
  5. 保留页面有一个在加载时运行的 javascript 方法,该方法每 X 秒重新加载一次页面。

【讨论】:

  • BackgroundWorker 类呢?推荐吗?
  • 用于桌面应用程序。为 asp.net 设计的多线程模式是异步页面模式。
  • 不幸的是,我无法使用异步页面,因为它不是在单个请求中发生的。
  • 然后继续在 ThreadPool 线程中运行您的工作,并将缓存用作线程安全(是的,它是线程安全的)位置来存储您的工作结果。只需检查每个请求,看看您的工作是否完成。 msdn.microsoft.com/en-us/library/…
  • 如果我向 Cache 对象添加一个标志,我什么时候在 ASP.NET 页面中检查这个标志?我必须把它放在一个无限的while循环中吗,像这样:while(true) { if (Cache["completed"] == true) break; }
【解决方案2】:

不,ThreadPool 中没有完成的事件,Join() 也没有简单的方法。

这是 Task 类在 .NET4 中解决的问题之一。任务有一个 Wait() 方法。

同时,请遵循 Will 回答中的建议。异步 ASP.NET 很容易出错。

【讨论】:

    猜你喜欢
    • 2019-09-26
    • 2012-03-26
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 2012-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多