我需要在网页上实施一项长期运行的任务。我想要做的是在一个单独的线程上运行任务,但在网页上有一个进度条。
我正在努力寻找一种简单的方法。这是一个非常简单的例子,我想这样做。基本上,我想在线程中使用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
答案 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方法定期回调服务器。以下是我所看到的程序的基本流程:
现在,我不确定这是一个网页的详细信息,但您可以尝试将状态存储在会话变量中(一旦您已经返回,可能会也可能不会),以及然后GetStatus将只读取最新状态。如果会话不起作用,那么您将需要以另一种方式(db,file等)保持状态。
请注意存储状态的频率。很多时候你会减慢你的进程,而且你的进程太少而且你没有给出准确的状态表示。
最后,如果你可以升级到.NET 4.0,那么使用TPL(任务并行库)会变得更加微不足道
答案 2 :(得分:0)
您对网页的运作方式感到困惑。
一旦线程被触发并且您将响应写入客户端,您将无法在线程进展时继续更新页面。
执行此类操作的一种方法是使用Ajax。 Ulhas已经向你展示了一个顶级的做法;所有你需要做的就是拥有他自己编写的javascript函数,直到你完成100%。你可以使用计时器来做到这一点。
答案 3 :(得分:0)
好的,在各种网站的帮助下,我设法做到了。
这是一个示例项目。如果有任何问题,请告诉我。我不是专家,所以我想要一些反馈!