gpt4 book ai didi

.net - ThreadPool.QueueUserWorkItem完成事件?

转载 作者:行者123 更新时间:2023-12-03 12:50:58 26 4
gpt4 key购买 nike

当用户单击按钮时,我使用ThreadPool.QueueUserWorkItem生成了一个启动长时间运行的线程的线程。我想在线程完成时使按钮可见,以便用户可以单击它。
ThreadPool中是否有已完成的事件

我想做什么?

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

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

  • MSDN链接具有以下代码:

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

  • 似乎 MyBeginMethod在Page Load上启动了,如果我想在单击按钮时启动异步过程,相同的代码段对我有用吗?
  • 我可以使用MyBeginMethodMyEndMethod方法访问UI控件(以便使下载文件按钮在过程完成时可见)吗?还是由其他线程拥有这些控件?
  • 最佳答案

    没有。

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

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

    首先,如果文件是按用户创建的,则长时间运行操作的结果应存储在 session 中,而不是缓存中。缓存在用户之间共享,并且 session 是按用户的。

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

    在此期间,UI有一些选项。一种是通过回发到服务器,另一种是通过ajax调用。

    即使有很多框架(如jQuery),并且网上有很多有关如何进行异步回发的信息,Ajax可能也不是最简单的。如果该过程很长,用户可能会浏览等等,从而使您的任务难以实现。

    另一种选择是提出您的文件请求,然后重定向到保留页面。该保留页面具有一个脚本,该脚本每X秒自动刷新一次。它向用户显示诸如“请稍候,正在创建文件”之类的通知。每次此页面回发到服务器时,都会检查文件的存在。如果尚未准备好,则返回到保留页面。最终,文件准备就绪,您可以将用户重定向到下载/显示/以任何方式下载文件的另一个页面。

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

  • 用户单击链接以获取文件
  • 回发时,服务器重定向到保留页面
  • 用户的浏览器重定向到保存页面
  • 请求由保留页面处理。检查 session 中的文件。
  • 如果 session 报告文件尚未创建,并且尚未创建,则将启动文件创建过程。保留页面返回给用户。
  • 如果 session 报告正在创建文件,则将保留页面返回给用户。
  • 如果 session 报告已完成文件,则将用户重定向到下载页面
  • 保留页面上有一个javascript方法,该方法在加载时运行,每隔X秒就会重新加载该页面。
  • 关于.net - ThreadPool.QueueUserWorkItem完成事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1738707/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com