2009-11-15 174 views
2

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

是否有ThreadPool

完成的事件那我想干什么?

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

快速适量约异步页:

  1. 的MSDN链接具有下面的代码:

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

看来,MyBeginMethod被踢掉页面加载,会为我相同的代码片段工作,如果我想要启动按钮上的异步过程点击?

  • 我可以访问MyBeginMethod和UI控件MyEndMethod方法(这样我可以做的过程中完成一个下载文件按钮可见?抑或是不同的线程拥有这些控件?
  • +0

    已更新的答案。另外,我会跳过异步页面。异步页面模式对于新开发人员来说非常混乱(我已经6年了,它仍然令我困惑!)。检查我的答案是一个好的解决方案。 – Will 2009-11-17 18:26:54

    回答

    4

    不。

    你必须保存你已经完成的地方提供给你的ASP.NET页面和方法做你的工作的事实,像HttpCache。

    如果这是所有发生withi N A单个请求,跳过线程池,并检查了asynchronous pages.


    首先,如果每个用户创建的文件,然后长时间运行操作的结果应存放在会话中,不缓存。缓存在用户之间共享,并且会话是按用户的。

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

    在此过程中有几个UI选项。一个是回发到服务器,另一个是ajax调用。

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

    另一种选择是对文件进行请求,然后重定向到保存页面。这个持有页面有一个脚本,每X秒自动刷新一次。它向用户显示诸如“请稍等,创建您的文件”等通知。每次该页面回传给服务器时,都会检查文件的存在。如果尚未准备好,则返回到保留页面。最终,文件已准备就绪,您可以将用户重定向到下载/显示文件的其他页面。

    第二种选择可能更容易,更直接,您可以执行。下面是伪代码:

    1. 用户点击一个链接来获取文件
    2. 在回传,服务器重定向到保持页面
    3. 用户的浏览器重定向到页保持
    4. 请求被保持处理页。会话被检查文件。
      1. 如果会话报告文件还没有被创建,那么文件创建过程就会开始。持有页面返回给用户。
      2. 如果会话报告正在创建文件,则将保存页面返回给用户。
      3. 如果该文件是由会话报告,将用户重定向到下载页面
    5. 保持网页有上重新加载页面每隔X秒负荷运行的JavaScript方法。
    +1

    BackgroundWorker类怎么样?这是建议吗? – Nick 2009-11-15 20:41:09

    +1

    用于桌面应用程序。为asp.net设计的多线程模式是异步页面模式。 – Will 2009-11-15 21:45:29

    +0

    不幸的是,我不能使用异步页面,因为它不会在单个请求中发生。 – Nick 2009-11-15 21:59:30

    1

    不,没有完成的事件ThreadPool,也没有一个简单的方法来Join()

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

    与此同时,按照Will的答案推荐。异步ASP.NET很容易出错。