BackgroundWorker - 等待它完成或超时已过
问题描述:
我有一个网页,它由一个数据输入窗体和一个显示结果的面板组成。这个页面是用VB.Net编写的,托管它的网站是用ASP.Net编写的。BackgroundWorker - 等待它完成或超时已过
页面的正常使用如下:
- 用户输入的形式与一些数据/过滤器
- 用户按下按钮“搜索”
- 甲
BackgroundWorker
开始寻找解决方案
BackgroundWorker实例存储在一个静态变量中,因为我不关心多用户场景,但是我并不关心这个选择,我可以改变它。此外,搜索过程是异步的,但我真的不需要在处理过程中显示任何内容。 BackgroundWorker将结果存储在SolutionStorage
对象中。
我的目标如下。
当BackgroundWorker结束时,找到的解决方案必须显示在页面上。但是,如果经过一段固定的时间(当前为三分钟),它仍然在运行,我想终止它并在那一刻显示SolutionStorage中存在的解决方案。
代码如下。
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsNothing(worker) Then
worker.CancelAsync()
End If
worker = New BackgroundWorker()
worker.WorkerReportsProgress = False
worker.WorkerSupportsCancellation = True
AddHandler worker.DoWork, AddressOf workerDo
AddHandler worker.RunWorkerCompleted, AddressOf workerComplete
End Sub
Protected Sub search(ByVal sender As Object, ByVal e As EventArgs) Handles submitButton.Click
worker.RunWorkerAsync()
Thread.Sleep(180 * 1000)
If worker.IsBusy Then
worker.CancelAsync()
Dim solutions = repository.getSolutions()
'' Display solutions
If (solutions.Count > 0) Then
SolutionsRepeater.DataBind()
End If
End If
End Sub
Protected Sub workerDo()
' Collect data from the form
' Build the SolutionStorage
' Start the search
End Sub
Protected Sub workerComplete(sender As Object, e As RunWorkerCompletedEventArgs)
'' Display solutions
If (solutions.Count > 0) Then
SolutionsRepeater.DataBind()
End If
End sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsNothing(worker) Then
worker.CancelAsync()
End If
worker = New BackgroundWorker()
worker.WorkerReportsProgress = False
worker.WorkerSupportsCancellation = True
AddHandler worker.DoWork, AddressOf workerDo
AddHandler worker.RunWorkerCompleted, AddressOf workerComplete
End Sub
这是做事情的正确方法?这是更好的做事方式吗?
答
锁定一个睡眠呼叫3分钟的asp.net线程并不是一个很好的解决方案。
我会建议你建立一个后台系统,可以在后台进行搜索,以便你的asp.net网页立即返回。然后,您可以每隔10秒刷新页面至 查看搜索是否仍在运行,完成或失败。
这里有一个小窍门,你也许可以使用,但它有一些限制和警告:
http://blog.*.com/2008/07/easy-background-tasks-in-aspnet/
阅读评论,看的警告和限制。
但是由于您不关心多用户支持,并且我假设访问您网页的次数非常有限,所以我看不到您当前的解决方案存在直接问题。但只要你展开它,它可能会导致你一些问题。
这里主要的问题是:生成的线程_won't stop_!按照我的意愿,该页面显示超时时间过后解决方案。但为什么线程继续? 我很关心多用户场景。全世界有20个人每天访问该页面30次。 – Che 2012-09-14 23:07:23