这是场景。
我有一个遵循基于异步事件设计模式的 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 套接字来处理多个异步请求。是真的吗?
最佳答案
您必须为请求实现一些独特的标记。
看...即您有控件 A,因此您必须为该控件创建一个唯一标记/ID 并发送它。
并且在回调方法下,您必须返回该标记/ID,以便您可以在 CONTROL 中过滤消息。
最好的方法是在客户端/服务器之间发送一些 MESSAGE BOX,这样您就可以轻松地在其中添加该 ID 以及错误消息。
类似的东西......
关于windows - 异步 WCF 调用在客户端中处理不当,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15532903/