データ入力用のフォームと結果を表示するためのパネルで構成される Web ページがあります。このページは VB.Net で書かれており、このページをホストしている Web サイトは ASP.Net です。
ページの通常の使用方法は次のとおりです。
- ユーザーは、いくつかのデータ/フィルターを使用してフォームに入力します
- ユーザーは「検索」ボタンを押します
- A
BackgroundWorker
は解決策を見つけ始めます
マルチユーザー シナリオは気にしないので、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
これは正しいやり方ですか?これは物事を行うためのより良い方法ですか?