我已经读了几天了,我不知道我应该在这里做些什么。我实际上是一名C#开发人员,VB.NET中的编程有时会让人感到困惑。除此之外,我正在尝试在我正在创建的新项目中从WCF实现Async调用。我已经尝试了几种不同的结果,但我想确保我所做的是正确的。
从我读过的内容来看,你永远不应该在异步方法中返回一个空格,所以我努力避免它。除此之外,我想我只想知道这是否是构建此页面的有效方法。当我构建它时,它将从WCF调用多个方法。
Public Class _DefaultReservation
Inherits System.Web.UI.Page
Dim wcfReservation As WCFReservation.WDReservationClient
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
SetupPage()
End Sub
Private Async Sub SetupPage()
wcfReservation = DirectCast(Master, LoggedInMaster).wcfReservation
Dim resData As String = Await wcfReservation.GetDataAsync(123)
Response.Write(resData)
End Sub
End Class
我想令人困惑的是,如果我将该代码放在异步函数中并返回任务,我必须将page_load处理程序标记为异步。这样做似乎不对吗?通过这样做,似乎异步函数调用异步函数。但是我在这里的方式,我的异步函数返回void,应该避免这种情况。如果需要,我也可以发布另一种方式的例子。谢谢!!
编辑:这效果更好吗?
Imports System.Threading.Tasks
Public Class _DefaultReservation 继承System.Web.UI.Page
Dim wcfReservation As WCFReservation.WDReservationClient
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
SetupPage()
End Sub
Private Async Sub SetupPage()
wcfReservation = DirectCast(Master, LoggedInMaster).wcfReservation
Dim getDataResult = Await GetDataAsync()
Response.Write(getDataResult)
End Sub
Private Function GetDataAsync() As Task(Of String)
Return wcfReservation.GetDataAsync(123)
End Function
结束班
编辑3:
Imports System.Threading.Tasks
Public Class _DefaultReservation 继承System.Web.UI.Page
Dim wcfReservation As WCFReservation.WDReservationClient
Protected Async Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
wcfReservation = DirectCast(Master, LoggedInMaster).wcfReservation
Dim result As String = Await wcfReservation.GetDataAsync(1234)
Response.Write(result)
End Sub
结束班
答案 0 :(得分:1)
你应该避免async void
。此指南的例外情况是您拥有async
事件处理程序。
例如Page_Load
。
有关本指南的详细信息,请参阅我在Best Practices in Asynchronous Programming上的MSDN文章。
这样做似乎不对吗?通过这样做,似乎异步函数调用异步函数。
这是完全正确的。异步代码将通过您的代码库“增长”。正确的解决方案是让SetupPage
成为Task
- 返回函数,并await
将其放在Page_Load
中(这是async void
/ Sub)。
修改强>
Imports System.Threading.Tasks
Public Class _DefaultReservation Inherits System.Web.UI.Page
Dim wcfReservation As WCFReservation.WDReservationClient
Protected Async Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Dim getDataResult = Await GetDataAsync()
Response.Write(getDataResult)
End Sub
Public Function GetDataAsync() As Task(Of String)
wcfReservation = DirectCast(Master, LoggedInMaster).wcfReservation
Return wcfReservation.GetDataAsync(123)
End Function
End Class
答案 1 :(得分:1)
幸运的是,我昨天只是posted about Async Sub。简而言之,在您使用Async Sub的情况下,一旦遇到await,控制将恢复为调用方法。因此,page_Load处理程序将在SetupPage完成之前结束。如果你想让Page_Load等到SetupPage异步完成,你需要将SetupPage更改为返回Task的函数,然后在Page_Load(导致Page_Load)中等待SetupPage为Async。
Async Sub在事件处理程序上有效。卢西安在他最近的Async Patterns post中对此进行了详细讨论。您可能还想查看去年的Async talk from ASP.Net Conf,了解有关在ASP.Net/WCF中使用Async的特殊注意事项。