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