Asp.net 使事件函数等待直到在codebehind中完成UpdatePanel异步回发
我有一个Web表单,它有一个更新数据值的Asp.net 使事件函数等待直到在codebehind中完成UpdatePanel异步回发,asp.net,vb.net,asp.net-core,asp.net-ajax,Asp.net,Vb.net,Asp.net Core,Asp.net Ajax,我有一个Web表单,它有一个更新数据值的UpdatePanel。我下面还有一个按钮,它调用CodeBehind中的函数,该函数将使用UpdatePanel中的值作为值 到目前为止,代码工作得很好,但是如果我触发面板更新,然后快速单击按钮,如果足够快,可能会导致运行时错误,因为单击事件的执行速度比更新面板快,并且在异步操作之前完成 我曾尝试在函数顶部添加updatePanel.Update(),但显然这是在启动一个新进程,而不是强制现有进程等待 如何让函数在代码隐藏中等待异步任务完成 由Updat
UpdatePanel
。我下面还有一个按钮,它调用CodeBehind中的函数,该函数将使用UpdatePanel
中的值作为值
到目前为止,代码工作得很好,但是如果我触发面板更新,然后快速单击按钮,如果足够快,可能会导致运行时错误,因为单击事件的执行速度比更新面板
快,并且在异步操作之前完成
我曾尝试在函数顶部添加updatePanel.Update()
,但显然这是在启动一个新进程,而不是强制现有进程等待
如何让函数在代码隐藏中等待异步任务完成
由UpdatePanel触发的异步函数(将hfDeleteAppID
值设置为1)
protectedsub btn_A1_Sub_Click(发送方作为对象,e作为事件参数)处理btn_A1_Sub。Click
如果btn_A1_Sub.CssClass=“fas fa lg fa乘以圆”,则
hfDeleteAppID.Value=1
其他的
applicationTransactions.saveUserApplication(Context.User.Identity.GetUserId(),1)
dgYourApps.DataBind()
如果结束
端接头
正在调用的函数(需要使用hfDeleteAppID
的值)
Protected Sub-App\u Delete(发送方作为对象,e作为事件参数)
upApplications.Update()
Dim appID为Double=hfDeleteAppID.Value
applicationTransactions.deleteApplication(Context.User.Identity.GetUserId(),appID)
dgYourApps.DataBind()
端接头
声明TaskCompletionSource字段,实例化并在删除处理程序中等待它,该处理程序必须更改为async
Dim tcs As TaskCompletionSource(Of Boolean)
...
Protected Async Sub App_Delete(sender As Object, e As EventArgs)
tcs = new TaskCompletionSource(Of Boolean)
upApplications.Update()
'Wait until btn_A1_Sub_Click has finished
await tcs.Task
Dim appID As Double = hfDeleteAppID.Value
applicationTransactions.deleteApplication(Context.User.Identity.GetUserId(), appID)
dgYourApps.DataBind()
End Sub
在按钮单击处理程序中设置TCS的结果:
Protected Sub btn_A1_Sub_Click(sender As Object, e As EventArgs) Handles btn_A1_Sub.Click
If btn_A1_Sub.CssClass = "fas fa-lg fa-times-circle" Then
hfDeleteAppID.Value = 1
Else
applicationTransactions.saveUserApplication(Context.User.Identity.GetUserId(), 1)
dgYourApps.DataBind()
End If
'Set the tcs to completed
'Do some checks her and set result to false in case of error e.g.
If tcs IsNot Nothing Then
tcs.SetResult(True)
End If
End Sub
您可以肯定地将其声明为double并直接设置hfDeleteAppID
的结果,而不是使用boolean类型的TCS。我在这里没有看到任何异步代码。您应该声明事件async void
和wait up applications.Update()
当触发UpdatePanel触发器以异步更新页面的该部分时,将执行第一个函数,单击按钮时将调用第二个函数。因此,代码本身不是异步的,但过程是异步的。在btn\u A1\u Sub\u中调用SetResult
,单击并在App\u Delete
中等待其任务。或者调用任务的Result
属性,但这将阻塞主线程。