【发布时间】:2013-09-21 03:00:40
【问题描述】:
使用带有 CancellationToken 的新 .Net 4.5 Async/Await 功能,当我取消 ExecuteNonQueryAsync 调用时,我得到一个 SQLException,而不是 OperationCanceledException(或其他一些特定于取消操作的异常) )。 SQLException 确实在消息末尾说 Operation cancelled by user。我希望在取消操作时会引发更具体的异常。此外,我将如何创建适当的 Try/Catch 处理程序来处理这种预期情况?我通常会将SQLException 作为更一般的故障块,但现在我必须梳理消息的文本,看看这是否只是用户单击取消按钮!?我一定是错过了什么。
这是一个简单的 VB WinForm 应用程序,它有两个按钮,一个用于执行异步调用,另一个用于取消。第一个按钮中的 Try/Catch 显示了在第二个按钮调用 Cancel 方法时被点击的 SQLException。
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 异常。 所以问题仍然存在:取消异步任务时应该得到什么异常?还是取决于每种方法及其实现?
【问题讨论】:
-
使用 SqlException.Number。
-
SqlException.Number= 0。SqlException.Errors(1).Number= 0。不是很有帮助。 -
我遇到了同样的问题。您找到了解决方案还是使用了 Message 属性?
-
不,我没有发现取消 Async 方法时抛出一致的异常类。
-
你为什么不使用 OpenAsync() ?
标签: .net async-await