ASP.NET(VB.NET 4.5)调用异步WCF方法

时间:2013-04-04 13:49:49

标签: vb.net wcf asynchronous .net-4.5

我已经读了几天了,我不知道我应该在这里做些什么。我实际上是一名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

结束班

2 个答案:

答案 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的特殊注意事项。