新线程的进度状态

时间:2010-01-21 19:26:34

标签: c# asp.net ajax multithreading

我正在新线程中执行耗时的任务。

 ParameterizedThreadStart pts = new ParameterizedThreadStart(WorkingFoo);
 Thread thread = new Thread(pts);

WorkingFoo执行任务并跟踪进度步骤 (它可以返回“步骤”和当前步骤的总数)。

我想在进度条中显示此信息(简单的div或ajax控件,我不介意)。

我不希望,当然,在视觉上刷新将显示进度的页面 另外,我想尽可能减少回发的次数。

那我该怎么做呢?  如何在网页上显示新线程的当前进度?

此外,显示进度的页面可以关闭并重新显示,但仍然可以获得当前状态。

请不要jQuery。

1 个答案:

答案 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响应。如果你想变得更加漂亮,你可以把它变成一个真正的矩形条,随着工作的进行而增长。

但是如何构建该小部件,是另一个问题的主题。


另请参阅:Dino Esposito's MSDN Magazine article on the topic