0

私は何日も読んでいますが、ここで何をすべきかよくわかりません。私は実際には C# 開発者であり、VB.NET でのプログラミングは少し混乱することがあります。それはさておき、ここで作成している新しいプロジェクトで WCF からの非同期呼び出しを実装しようとしています。私はいくつかの異なる方法で結果を試しましたが、私がやっていることは適切であることを確認したいと思います.

私が読んだことから、非同期メソッドで決して void を返すべきではないので、それを避けるために最善を尽くしています。それはさておき、これがこのページを作成するための有効な方法であるかどうかを知りたいだけだと思います. ビルドすると、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 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 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 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

    wcfReservation = DirectCast(Master, LoggedInMaster).wcfReservation

    Dim result As String = Await wcfReservation.GetDataAsync(1234)
    Response.Write(result)

End Sub

クラス終了

4

2 に答える 2

1

避けるべきなのは事実ですasync void。このガイドラインの例外は、asyncイベント ハンドラーがある場合です。

などPage_Load

このガイドラインの詳細については、非同期プログラミングのベスト プラクティスに関する MSDN の記事を参照してください。

このようにするのは正しくないようですか?そうすることで、非同期関数が非同期関数を呼び出しているように見えます。

その通りです。非同期コードは、コード ベースを通じて「成長」します。正しい解決策は、( /Sub である)を返す関数を作成SetupPageすることです。TaskawaitPage_Loadasync void

編集:

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
于 2013-04-04T14:13:48.063 に答える
1

運が良ければ、昨日Async Sub について投稿したところです。簡単に言えば、あなたの場合、Async Subを使用すると、待機が発生するとすぐに制御が呼び出し元のメソッドに戻ります。その結果、setupPage が完了する前に page_Load ハンドラーが終了します。SetupPage が非同期的に完了するまで Page_Load を待機させたい場合は、SetupPage を Task を返す関数に変更し、次に Page_Load で SetupPage を待機する (Page_Load を引き起こす) ように Async に変更する必要があります。

Async Sub はイベント ハンドラーで有効です。Lucian は、最近のAsync Patterns の投稿で、これについて詳しく説明しています。また、ASP.Net /WCF で Async を使用する際の特別な考慮事項について、昨年のASP.Net Confの Async トークもチェックしてください。

于 2013-04-04T14:14:25.977 に答える