2

这是场景。

我有一个遵循基于异步事件的设计模式的 WinForm 应用程序(C#,.NET 3.5)。

主控件(MainResultControl)根据用户请求创建多个子控件(ResultControl)实例。每个子控件都有一组独特的参数供用户选择。

然后每个子控件异步调用 WCF 服务:

WebServiceClient.GetResultsAsync(Parameters param)

每个子控件还注册了 Web 服务的 GetResultsCompleted 事件

WebServiceClient.GetResultsCompleted += _service_GetResultsCompleted()

这是我们面临的问题。用户抱怨有时 ResultControl 会显示意外的数据集 - 与他们请求的内容无关。

一个控件实例是否有可能收到另一个实例在处理 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 中过滤消息。

最好的方法是,如果您将在客户端/服务器之间发送一些 MESSAGE BOX,这样您就可以轻松地在那里添加该 ID 和错误消息。

那样的东西...

于 2013-03-20T19:30:11.717 回答