私のチームと私は一週間中この周りに頭を叩いています。助けをお待ちしています。私たちはVB.Netを使用しています。私たちは、ユーザーがSQLCommandを使用して実行するのに数分かかるストアドプロシージャを実行するフォームを持っています。ユーザーは、実行中にアプリケーションで作業を続けたり、処理の途中でリクエストを取り消したりできるようにしたいと考えています。我々は、スレッドとバックグラウンドワーカー、および非同期処理について検討しました。ストアドプロシージャの実行をキャンセルし、エラーなく安全にスレッドを実行できるソリューションを見つけることはできません。誰でもこれを安全に行う方法を知っていますか?これまでのところこれがあります。セキュリティとサイズのために一部の詳細が削除されました.Netを実行する方法:SQLCommandは、ユーザーが安全に途中でキャンセルできるようにする独自のスレッドです
Private Sub frmAdhocRptGenerator_Load(sender As Object, e As EventArgs) Handles Me.Load
BackGroundWorkerAdhoc.WorkerReportsProgress = True
BackGroundWorkerAdhoc.WorkerSupportsCancellation = True
End Sub
Private Sub btnExecute_Click(sender As Object, e As EventArgs) Handles btnExecute.Click
If Not BackGroundWorkerAdhoc.IsBusy = True Then BackGroundWorkerAdhoc.RunWorkerAsync()
End Sub
Private Sub BackGroundWorkerAdhoc_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackGroundWorkerAdhoc.DoWork
Try
If BackGroundWorkerAdhoc.CancellationPending = True Then
e.Cancel = True
Exit Sub
End If
Load_n_ExecuteProc(tmpConn)
Catch ex As Exception
ErrorHandler("frmAdhocRptGenerator.subBackGroundWorkerAdhoc_DoWork", ex.ToString)
tmpConn.Close()
End Try
End Sub
Private Function Load_n_ExecuteProc(theConn As SqlConnection) As Boolean
If BackGroundWorkerAdhoc.CancellationPending = True Then
Return False
Exit Function
End If
Try
Dim RunCompleted As Boolean = False
cmdPROVIDER_FINDER = New SqlCommand("SP$PROVIDER_FINDER", tmpConn)
cmdPROVIDER_FINDER.CommandType = CommandType.StoredProcedure
cmdPROVIDER_FINDER.CommandTimeout = 10000
Dim rst As Integer = cmdPROVIDER_FINDER.ExecuteNonQuery()
RunCompleted = rst > -1
Return RunCompleted
Catch ex As Exception
ErrorHandler("frmAdhocRptGenerator.Load_n_ExecuteProc", ex.ToString)
Return False
End Try
End Function
Private Sub BackGroundWorkerAdhoc_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackGroundWorkerAdhoc.RunWorkerCompleted
Try
If Success = True Then
Dim filename As String = "AdhocResults" & Now.Month.ToString & "-" & Now.Day.ToString & "-" & Now.Year.ToString
Export2Excel("SELECT * FROM ##PF_PROVIDERS" & currUser.UserID, filename, True)
End If
tmpConn.Close()
Success = False
Catch ex As Exception
ErrorHandler("frmAdhocRptGenerator.BackGroundWorkerAdhoc_RunWorkerCompleted", ex.ToString)
Finally
tmpConn.Close()
End Try
End Sub
Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click
If BackGroundWorkerAdhoc.IsBusy = True Then
BackGroundWorkerAdhoc.CancelAsync()
cmdPROVIDER_FINDER.Cancel()
tmpConn.Close()
tmpConn = Nothing
End If
btnCancel.Enabled = False
End Sub
あなたの現在の実装で直面しているエラー/望ましくない動作は何ですか? –
.NET 4.5以降を使用していますか?もし 'ExecuteNonQueryAsync'を呼び出してCancellationTokenを渡すことができれば、バックグラウンドワーカーの代わりにasync/awaitを使うことができるので、リクエストを取り消すこともできます。 –
こんにちはスコット、ネット上にいた。私は、ネットを更新して、それが何かダウンストリームに影響を与えるかどうか調べ始めるだろう。 Alex、エラーは「現在のコマンドで重大なエラーが発生しました」またはタイムアウトエラーです。コマンドをキャンセルすると私には表示されませんが、プロシージャが実行されたかキャンセルされたことをbgworkerに伝え、タイムアウトまで待機し続けます。 – AdeodatusX