【发布时间】:2019-12-29 00:46:16
【问题描述】:
在我的本地计算机上,当我单击 ID 为 lbtnPay 的按钮时,此代码有效:
Protected Sub lbtnPay_Click(sender As Object, e As EventArgs) Handles lbtnPay.Click
ReportError("lbtnPay_Click")
StartPayment(ddlAmount.SelectedValue * 100)
End Sub
Protected Async Sub StartPayment(ByVal priceInCents As Integer) 'already includes 21% TAX
ReportError("StartPayment")
Dim paymentResponse As PaymentResponse = Await paymentClient.CreatePaymentAsync(paymentRequest)
End Sub
<asp:Panel ID="pnlWallet" runat="server">
<asp:LinkButton ID="lbtnPay" Text="<%$Resources:paynow %>" runat="server"/>
</asp:Panel>
但是,当我将此代码放在生产服务器上并单击 lbtnPay 按钮时,页面只会继续加载,而代码行 ReportError("StartPayment") 永远不会执行。这条代码线是ReportError("lbtnPay_Click")
我在 Google 上搜索并搜索了 SO,但我找不到任何东西甚至可以指出我应该看的方向。 我的本地开发环境和产品服务器之间的哪些设置可能不同可能会影响异步功能的正确工作?
【问题讨论】:
-
你怎么什么都不等?例如:
Await StartPayment()... 如果你这样做,那么lbtnPay_Click需要是Async。此外,如果不需要等待ReportError,则删除Async关键字,因为您无需等待任何内容。 -
@Çöđěxěŕ 好电话,我把它省略了以保持清晰。我现在在 StartPayment 中添加了 Await 代码行。这证明了当前代码的合理性,对吗?所以我想我的问题仍然是为什么它在本地工作而不是在生产环境中工作。
-
据我所知,当前代码看起来不错。关于为什么它在本地工作而不是在您的生产环境中工作,我真的没有很好的答案。可以肯定的一件事是,如果您不等待异步方法,则实际上无法保证代码甚至会完成。这也就像在说
Task.Run它没有等待,所以不能保证它会完成。 -
这不是真的。可以/应该等待一个任务。方法上的
Async关键字允许您在其中使用Await。您的事件处理程序lbtnPay_Click可以是Async(并且处理程序本身还没有等待,看到了吗?)并允许您在其中处理Await StartPayment...。但是开始付款需要返回一个任务。或者您可以即时创建任务Await Task.Factory.StartNew(Sub() StartPayment(ddlAmount.SelectedValue * 100))。您需要创建自己的 Action,因为 StartNew 不接受带有参数的方法。但我提供的线路应该可以工作。 -
另外你的asp需要标记为异步:
<%@ Page Language="VB" Async="true" ... %>
标签: asp.net vb.net webforms async-await