Asp.net 使事件函数等待直到在codebehind中完成UpdatePanel异步回发

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

我有一个Web表单,它有一个更新数据值的
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
属性,但这将阻塞主线程。