带有池的asp.net异步线程

带有池的asp.net异步线程,asp.net,multithreading,asynchronous,Asp.net,Multithreading,Asynchronous,我有一个长期运行的任务,我需要在网页上实现。我想做的是在一个单独的线程上运行任务,但是在网页上有一个进度条 我正在努力找到一个简单的方法来做到这一点。这里是一个非常简单的例子,我想在上面做这个。基本上,我希望ResetAll()在一个线程中,并将变量y汇集在一起以更新网页UI 有人能帮我吗 Protected Sub btnReset_Click(sender As Object, e As System.EventArgs) Handles btnResetLowConductor.Click

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

我正在努力找到一个简单的方法来做到这一点。这里是一个非常简单的例子,我想在上面做这个。基本上,我希望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
Protected Sub btnReset_Click(发送者作为对象,e作为系统.EventArgs)处理btnResetLowConductor。单击
ResetAll()
端接头
私有子重置全部()
将y调整为整数=0
而y
只要线程处于活动状态,lblProgress就不会更新。您将只获得y和x的最终值,即当线程失效时。可以将Y和X的值存储在会话变量中

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

    End While
End Sub
代码隐藏:C#


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

  • 用户进行初始呼叫
  • 启动新线程以运行进程并返回0%状态
  • 定期通过ajax调用web服务器(返回完成百分比的GetStatus调用)
    • 如果呼叫完成,请适当更新/刷新页面
    • 如果呼叫未完成,则使用返回状态
现在,鉴于这是一个web页面,我不太确定它的细节,但是您可以尝试定期将状态存储在会话变量中(一旦返回,可能不可能),然后GetStatus将只读取最新的状态。如果会话不工作,则需要以另一种方式(db、文件等)保持状态

只是要注意存储状态的频率。太多的时候,你会放慢你的进程,太少的时候,你不会给出一个准确的状态表示


最后,如果您可以升级到.NET 4.0,那么使用TPL(任务并行库)将变得更加简单。

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

一旦启动线程并将响应写入客户端,您将无法在线程进行时继续更新页面


做这类事情的一种方法是使用Ajax。UlTop已经向您展示了一种实现这一点的方法;您所需要做的就是让他编写的javascript函数自己调用,直到100%完成为止。你可以用定时器来完成这项工作。

好的,在各种网站的帮助下,我成功地做到了这一点

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

function GetCurrentThreadStatus()
{
       PageMethods.GetThreadStatus(function(status){
           // success
           $("span[id*='lblProgress']").text(status);
       });
}
[WebMethod]
public static string GetThreadStatus()
{
     return  (string)Session["CurrentStatus"];
}