我有一个网页,由一个数据输入表单和一个显示结果的面板组成。这个页面是用VB.Net编写的,托管它的网站是ASP.Net。
页面的正常用法如下:
BackgroundWorker
开始寻找解决方案 BackgroundWorker实例存储在一个静态变量中,因为我不关心多用户场景,但我没有依赖这个选择,我可以改变它。此外,搜索过程是异步的,但我真的不需要显示任何东西,因为它是在progess。
BackgroundWorker将结果存储在SolutionStorage
对象中。
我的目标如下
当BackgroundWorker结束时,找到的解决方案必须显示在页面上。但是,如果在一段固定的时间(目前为3分钟)之后它仍在运行,我想终止它并在那一刻显示解决方案存储中存在的解决方案。
代码如下:
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
这是一种正确的做事方式吗?这是更好的做事方式吗?
答案 0 :(得分:0)
使用睡眠呼叫锁定一个asp .net线程3分钟并不是一个很好的解决方案。
我建议你构建一个可以在后台搜索的后台系统,这样你的asp .net页面就会立即返回。然后你可以每隔10秒刷新一次页面 查看搜索是否仍在运行,完成或失败。
这是一个你可以使用的小技巧,但它有一些限制和警告:
http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/
阅读评论以查看警告和限制。
但是,由于您不关心多用户支持,并且我认为对您网页的访问次数非常有限,因此我无法看到您当前解决方案的直接问题。但是一旦你扩展它,它可能会给你带来一些问题。