异步WCF调用在客户端中处理不当

时间:2013-03-20 19:26:33

标签: windows vb.net winforms wcf asynchronous-wcf-call

以下是该方案。

我有一个遵循基于异步事件的设计模式的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套接字来处理多个异步请求。这是真的吗?

1 个答案:

答案 0 :(得分:1)

您必须实现请求的一些唯一标记。

见... I.e.你有控件A,所以你必须为该控件创建一个唯一的标记/ ID并发送它。

在回调方法下,您必须返回该标记/ ID,以便您可以过滤CONTROL中的消息。

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

像这样......