1

データ入力用のフォームと結果を表示するためのパネルで構成される Web ページがあります。このページは VB.Net で書かれており、このページをホストしている Web サイトは ASP.Net です。

ページの通常の使用方法は次のとおりです。

  1. ユーザーは、いくつかのデータ/フィルターを使用してフォームに入力します
  2. ユーザーは「検索」ボタンを押します
  3. ABackgroundWorkerは解決策を見つけ始めます

マルチユーザー シナリオは気にしないので、BackgroundWorker インスタンスは静的変数に格納されますが、この選択に縛られているわけではなく、これを変更できます。また、検索プロセスは非同期ですが、進行中に何も表示する必要はありません。BackgroundWorker は結果をSolutionStorageオブジェクトに格納します。

私の目標は次のとおりです。
BackgroundWorker が終了したら、見つかったソリューションをページに表示する必要があります。ただし、一定時間 (現在は 3 分) が経過してもまだ実行されている場合は、それを終了して、その時点で 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


これは正しいやり方ですか?これは物事を行うためのより良い方法ですか?

4

1 に答える 1