BackgroundWorker - 等待它完成或超时

时间:2012-07-29 09:44:57

标签: asp.net vb.net backgroundworker

我有一个网页,由一个数据输入表单和一个显示结果的面板组成。这个页面是用VB.Net编写的,托管它的网站是ASP.Net。

页面的正常用法如下:

  1. 用户输入带有一些数据/过滤器的表单
  2. 用户按下“搜索”按钮
  3. BackgroundWorker开始寻找解决方案
  4. 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
    


    这是一种正确的做事方式吗?这是更好的做事方式吗?

1 个答案:

答案 0 :(得分:0)

使用睡眠呼叫锁定一个asp .net线程3分钟并不是一个很好的解决方案。

我建议你构建一个可以在后台搜索的后台系统,这样你的asp .net页面就会立即返回。然后你可以每隔10秒刷新一次页面 查看搜索是否仍在运行,完成或失败。

这是一个你可以使用的小技巧,但它有一些限制和警告:

http://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

阅读评论以查看警告和限制。

但是,由于您不关心多用户支持,并且我认为对您网页的访问次数非常有限,因此我无法看到您当前解决方案的直接问题。但是一旦你扩展它,它可能会给你带来一些问题。