使用带有 CancellationToken 的新 .Net 4.5 Async/Await 功能,我SQLException
在取消ExecuteNonQueryAsync
呼叫时得到一个,而不是一个OperationCanceledException
(或其他一些特定于取消操作的异常)。SQLException
确实在消息的Operation cancelled by user
末尾说。我希望在取消操作时会引发更具体的异常。此外,我将如何创建适当的 Try/Catch 处理程序来处理这种预期情况?我通常会有SQLException
更一般的失败块,但现在我必须梳理消息的文本,看看这是否只是用户单击取消按钮!?我肯定错过了什么。
这是一个简单的 VB WinForm 应用程序,它有两个按钮,一个用于执行异步调用,另一个用于取消。第一个按钮中的 Try/Catch 显示了SQLException
当第二个按钮调用 Cancel 方法时被击中的那个。
Dim _cts As CancellationTokenSource
Private Async Sub btnLocalTest_Click(sender As Object, e As EventArgs) Handles btnLocalTest.Click
_cts = New CancellationTokenSource()
Dim CancelToken As CancellationToken = _cts.Token
Using sconn As New SqlConnection("server=(local);database=MyDB;user id=MyUser;password=MyPassword")
sconn.Open()
Dim SQL As String = some long running SELECT or INSERT statement
Try
Using scmd As New SqlCommand(SQL, sconn)
scmd.CommandTimeout = 300
Dim i As Integer = Await scmd.ExecuteNonQueryAsync(CancelToken)
End Using
Catch exCancel As OperationCanceledException
LogEvent("Query canceled Exception.") ' This error is *not* thrown on Cancel.
Catch ex As SqlClient.SqlException
LogEvent("Error with query. " & ex.Message) ' This error *is* thrown on Cancel. Message includes text 'Canceled by user.'
End Try
sconn.Close()
_cts = Nothing
End Using
End Sub
Private Sub btnLocalTestCancel_Click(sender As Object, e As EventArgs) Handles btnLocalTestCancel.Click
If _cts IsNot Nothing Then
_cts.Cancel()
End If
End Sub
更新:HttpClient.GetAsync
我使用支持取消的方法创建了一个不同的异步测试。当您取消该任务时,您可能会出现OperationCanceledException
我最初预期的异常。 所以问题仍然存在:取消 Async 任务时应该得到什么异常?还是取决于每种方法及其实现?