asp.net异步线程与池

时间:2012-02-27 15:53:54

标签: asp.net multithreading asynchronous

我需要在网页上实施一项长期运行的任务。我想要做的是在一个单独的线程上运行任务,但在网页上有一个进度条。

我正在努力寻找一种简单的方法。这是一个非常简单的例子,我想这样做。基本上,我想在线程中使用ResetAll(),并将变量y汇集在一起​​以更新网页UI。

有人可以帮助我吗?

Protected Sub btnReset_Click(sender As Object, e As System.EventArgs) Handles btnResetLowConductor.Click
    ResetAll()
End Sub

Private Sub ResetAll()
    Dim y As Integer = 0
    While y < x
        y += 1
        Reset()
        lblProgress.Text = y & "/" & x
    End While
End Sub


Private Sub Reset()
    Threading.Thread.Sleep(200)
End Sub

4 个答案:

答案 0 :(得分:1)

只要线程处于活动状态,您的lblProgress就不会更新。你只能获得y&amp;的最终价值。 x即线程死了。您可以存储Y&amp;的值。 X在会话变量中。

Private Sub ResetAll()
    Dim y As Integer = 0
    While y < x
        y += 1
        Reset()
        Session("CurrentStatus") = y & "/" & x

    End While
End Sub

在您的UI中,您将使用PageMethod即

触发异步事件
function GetCurrentThreadStatus()
{
       PageMethods.GetThreadStatus(function(status){
           // success
           $("span[id*='lblProgress']").text(status);
       });
}

代码背后:C#

[WebMethod]
public static string GetThreadStatus()
{
     return  (string)Session["CurrentStatus"];
}

答案 1 :(得分:0)

由于这是一个网站,您可能需要使用某种ajax方法定期回调服务器。以下是我所看到的程序的基本流程:

  • 用户进行初始通话
  • 启动新线程以运行进程并以0%状态返回
  • 定期通过ajax调用Web服务器(将返回完成百分比的GetStatus调用)
    • 如果通话完成,请相应地更新/刷新页面
    • 如果通话未完成,请使用返回状态

现在,我不确定这是一个网页的详细信息,但您可以尝试将状态存储在会话变量中(一旦您已经返回,可能会也可能不会),以及然后GetStatus将只读取最新状态。如果会话不起作用,那么您将需要以另一种方式(db,file等)保持状态。

请注意存储状态的频率。很多时候你会减慢你的进程,而且你的进程太少而且你没有给出准确的状态表示。

最后,如果你可以升级到.NET 4.0,那么使用TPL(任务并行库)会变得更加微不足道

答案 2 :(得分:0)

您对网页的运作方式感到困惑。

一旦线程被触发并且您将响应写入客户端,您将无法在线程进展时继续更新页面。

执行此类操作的一种方法是使用Ajax。 Ulhas已经向你展示了一个顶级的做法;所有你需要做的就是拥有他自己编写的javascript函数,直到你完成100%。你可以使用计时器来做到这一点。

答案 3 :(得分:0)

好的,在各种网站的帮助下,我设法做到了。

这是一个示例项目。如果有任何问题,请告诉我。我不是专家,所以我想要一些反馈!

http://www.mediafire.com/?7vn16vp78rave6a