BackgroundWorker - 等待它完成或超时已过

问题描述:

我有一个网页,它由一个数据输入窗体和一个显示结果的面板组成。这个页面是用VB.Net编写的,托管它的网站是用ASP.Net编写的。BackgroundWorker - 等待它完成或超时已过

页面的正常使用如下:

  1. 用户输入的形式与一些数据/过滤器
  2. 用户按下按钮“搜索”
  3. 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/

阅读评论,看的警告和限制。

但是由于您不关心多用户支持,并且我假设访问您网页的次数非常有限,所以我看不到您当前的解决方案存在直接问题。但只要你展开它,它可能会导致你一些问题。

+0

这里主要的问题是:生成的线程_won't stop_!按照我的意愿,该页面显示超时时间过后解决方案。但为什么线程继续? 我很关心多用户场景。全世界有20个人每天访问该页面30次。 – Che 2012-09-14 23:07:23