我正在新线程中执行耗时的任务。
ParameterizedThreadStart pts = new ParameterizedThreadStart(WorkingFoo);
Thread thread = new Thread(pts);
WorkingFoo执行任务并跟踪进度步骤 (它可以返回“步骤”和当前步骤的总数)。
我想在进度条中显示此信息(简单的div或ajax控件,我不介意)。
我不希望,当然,在视觉上刷新将显示进度的页面 另外,我想尽可能减少回发的次数。
那我该怎么做呢? 如何在网页上显示新线程的当前进度?
此外,显示进度的页面可以关闭并重新显示,但仍然可以获得当前状态。
请不要jQuery。
答案 0 :(得分:2)
首先,除非您确定需要,否则不要从ASPNET页面或应用程序启动类似的新线程。 使用线程池。
请参阅Advantage of using Thread.Start vs QueueUserWorkItem
关于您的问题 - 如何在浏览器中获取进度更新,而无需刷新页面...我假设您知道如何在jQuery中使用进度控件。您的问题围绕如何将这样的进度控制连接到服务器端逻辑。唯一的方法是通过请求,我建议ajax,从浏览器到服务器。
如果我是你,我会为工作线程提供一种方法,将其状态放入服务器上的资源 - 用户会话或数据库,或类似的东西。然后,让页面查询该状态的ajax请求。
在REST方案中,状态可能在
处可用http://myserver/Application/WorkItem12345/status
...其中WorkItem12345
是一个id,指向异步发生的worker或task。对从该页面到服务器的URL执行HTTP GET,您将获得一个指示状态的JSON结果,可能如下所示:
{"message": "working", "progress":56}
或
{"message": "completed", "progress":100}
或
{"message": "fault", "progress":14}
等。
服务器上必须有一个响应http://myserver/Application/WorkItem12345/status
的应用程序,并回复相应的消息。此状态逻辑应查看工作线程发布其状态的插槽或资源 - 无论您选择使用什么 - 然后构建广告返回JSON。
<强>附录强>
如果您不想使用jQuery,那么机制是相同的,但您需要编写自己的浏览器端UI小部件,以显示状态更新。在简单的情况下,它是一个带有html内容的简单div,显示了JSON响应。如果你想变得更加漂亮,你可以把它变成一个真正的矩形条,随着工作的进行而增长。
但是如何构建该小部件,是另一个问题的主题。