为什么我的任务在" WaitingForActivation"调用SqlCommand.BeginExecuteNonQuery后的状态?

时间:2015-01-20 20:20:28

标签: c# .net vb.net

给出以下代码:

           Dim t As Date = Now
            Dim e As New AsynchronousExecutionEventArgs
            AsyncDataExecuting = False
            Dim result As IAsyncResult = CType(Cmd, SqlClient.SqlCommand).BeginExecuteNonQuery()

            Do While Not (result.IsCompleted Or result.CompletedSynchronously)
                AsyncDataExecuting = True
                RaiseEvent OnAsynchronousProcessing(Me, e)

                If CInt(DateLib.TimeSpan(t, DateLib.TimeSpanTypeEnum.TicksPerMillisecond)) > AsynchronousProcessingDelay Then
                    _Common.InvokeDoEvents() 'we do this getting the datareader asynchronously so'
                End If
                If e.mCancel Then
                    If Not Cmd Is Nothing Then Cmd.Cancel()
                    If Not Cmd Is Nothing Then Cmd.Dispose()
                    AsyncDataExecuting = False
                    Exit Function
                End If
                System.Threading.Thread.Sleep(AsynchronousProcessingSleep)
            Loop
            If Not Cmd Is Nothing Then
                ExecSql = ToStr(CType(Cmd, SqlClient.SqlCommand).EndExecuteNonQuery(result))
            End If

我很困惑为什么有时结果对象是:

Id = 1, Status = WaitingForActivation {1}, Method = "{null}", Result = "{Not yet computed}" System.Threading.Tasks.Task(Of Object)

我原以为BeginExecuteNonQuery不允许任务进入" WaitingForActivation"模式。我如何(1)阻止任务处于WaitingForActiviation模式或(2)激活它?

PS:奇怪的是,如果我设置了一个SQL Profiler,我会看到SQL正在执行并且语句执行成功但是代码被卡在一个循环中,因为" IsCompleted"国旗永远不会被送去。

1 个答案:

答案 0 :(得分:2)

WaitingForActiviation表示此任务基于TaskCompletionSource,并且尚未由所有者完成。我不明白这个名字是怎么来的。

所以这很正常。这意味着任务没有完成。我怀疑SQL查询是否真的完成了,而Task.IsCompleted确实是错误的。如果您认为是这种情况,请发布更多细节,以便找到错误。

为什么使用旧的APM模式(IAsyncResult)?这已经过时了。使用ExecuteNonQueryAsync