2

これがシナリオです。

非同期イベント ベースの設計パターンに従う WinForm アプリケーション (C#、.NET 3.5) があります。

メイン コントロール (MainResultControl) は、ユーザーの要求に応じて子コントロール (ResultControl) の複数のインスタンスを作成します。各子コントロールには、ユーザーが選択する一意のパラメーター セットがあります。

次に、各子コントロールが WCF サービスを非同期的に呼び出します。

WebServiceClient.GetResultsAsync(Parameters param)

各子コントロールは、Web サービスの GetResultsCompleted イベントにもサインアップします

WebServiceClient.GetResultsCompleted += _service_GetResultsCompleted()

ここに私たちが直面している問題があります。ユーザーは、ResultControl が予期しないデータ セットを表示することがあると不満を漏らしています。要求したものとは関係ありません。

コントロールの 1 つのインスタンスが、Web サービスで発生した GetResultsCompleted イベントを処理するときに、他のインスタンスが要求した結果を受け取ることは可能ですか?

ありがとうございました。

ここにいくつかのサポート コード (VB) があります: 親コントロール (MainResultControl)

Private Sub Submit_Click(ByVal sender As System.Object, _
                         ByVal e As System.EventArgs) Handles tbSubmit.Click
    'a copy of MyRequestArgs is created with the details of request'
    pnlResult.Controls.Add(new ResultsControl(_myRequestArgs))
End Sub

子コントロール (ResultsControl):

Public Class ResultsControl

  Public _webRequestResult As WebRequestResult      

  Public Sub New(ByVal _requestArgs As MyRequestArgs)

     Dim _service as MyWebService()
     _service.GetTripSolutionsAsync(New TripPlannerParameters() _
                             With {.ApplicationID = _requestArgs.ApplicationID, _
                                   .Arrival = _requestArgs.Parameters.Arrival, _
                                   .Destination = _requestArgs.Parameters.Destination})
  End Sub

  Private Sub _service_GetTripSolutionsCompleted(ByVal sender As Object, _
                                               ByVal e As MyWebService.ResultCompletedEventArgs) Handles _service.GetTripSolutionsCompleted

     'Validation of correct results is done here
     'Skipped for simplicity
     _webRequestResult = DirectCast(e.Result, WebRequestResult)

  End Sub

End Class

編集:

何人かの人に相談したところ、WCF には、サービスから発生したイベントが、それを発生させた (クライアント マシン上の) 適切なオブジェクトによって確実に処理されるようにするいくつかの方法があるようです。アイデアは - WCF は、複数の非同期要求に対してクライアント マシン上のさまざまな IP ソケットを利用します。本当?

4

1 に答える 1

1

リクエストの一意のマーカーを実装する必要があります。

参照してください...つまり、コントロール A があるので、そのコントロールの一意のマーカー/ID を作成して送信する必要があります。

また、コールバック メソッドの下では、そのマーカー/ID を返して、CONTROL 内でメッセージをフィルタリングできるようにする必要があります。

最善の方法は、クライアント/サーバー間でメッセージ ボックスを送信して、その ID とエラー メッセージを簡単に追加できるようにすることです。

そんな感じ...

于 2013-03-20T19:30:11.717 に答える