给出以下代码:
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"国旗永远不会被送去。答案 0 :(得分:2)
WaitingForActiviation
表示此任务基于TaskCompletionSource
,并且尚未由所有者完成。我不明白这个名字是怎么来的。
所以这很正常。这意味着任务没有完成。我怀疑SQL查询是否真的完成了,而Task.IsCompleted
确实是错误的。如果您认为是这种情况,请发布更多细节,以便找到错误。
为什么使用旧的APM模式(IAsyncResult
)?这已经过时了。使用ExecuteNonQueryAsync
。