gpt4 book ai didi

c# - 为什么在调用 SqlCommand.BeginExecuteNonQuery 后我的任务处于 "WaitingForActivation"状态?

转载 作者:太空宇宙 更新时间:2023-11-03 10:35:14 24 4
gpt4 key购买 nike

给定以下代码:

           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”标志从未发送过。

最佳答案

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

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

为什么要使用旧的 APM 模式 (IAsyncResult)?这是过时的。使用 ExecuteNonQueryAsync

关于c# - 为什么在调用 SqlCommand.BeginExecuteNonQuery 后我的任务处于 "WaitingForActivation"状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28054432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com