以下是该方案。
我有一个遵循基于异步事件的设计模式的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套接字来处理多个异步请求。这是真的吗?
答案 0 :(得分:1)
您必须实现请求的一些唯一标记。
见... I.e.你有控件A,所以你必须为该控件创建一个唯一的标记/ ID并发送它。
在回调方法下,您必须返回该标记/ ID,以便您可以过滤CONTROL中的消息。
最好的方法是,如果您将在客户端/服务器之间发送一些MESSAGE BOX,那么您可以轻松地在那里添加该ID以及错误消息。
像这样......