取消异步查询时的SQLException

Dav*_*ner 9 .net async-await

使用具有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
Run Code Online (Sandbox Code Playgroud)

更新:我使用HttpClient.GetAsync支持取消的方法创建了不同的异步测试.当您取消该任务时,您可以获得OperationCanceledException我最初预期的异常. 所以问题仍然存在:取消异步任务时应该得到什么异常?或者这取决于每种方法及其实施?

小智 9

我通过检查"解决"这个问题CancelToken.IsCancellationRequestedCatch ex As SqlClient.SqlException块.