1

我的场景包含一个 .NET 4.0 WCF 服务,由包装在类库中的 .NET 4.5 客户端调用。

客户端异步调用 WCF 服务,并显示它返回的任何数据。该代码是非常标准的东西,看起来像这样:

Private m_Service As WcfService = Nothing

Public Event GetDataComplete As GetEventHandler

Public Sub GetData(bytes As Byte())

    m_Service = New WcfService()
    AddHandler m_Service.GetWcfDataComplete, AddressOf Service_GetWcfDataComplete
    m_Service.GetWcfData(bytes)

End Sub

Private Sub Service_GetWcfDataComplete(sender As Object, e As WcfService.GetWcfDataCompletedEventArgs)

    ' Process results from server...
    ' Signal completion.
    RaiseEvent GetDataComplete(Me, New GetEventArgs(New DataItem(e.Result)))

End Sub

因为 WCF 服务将返回的数据限制为 64k 块,所以我必须多次调用该服务,直到所有内容都下载完毕。此外,还会' Process results from server...进行一些处理以使用返回的数据更新 UI。可以预见的是,这会对 UI 线程造成可怕的影响。

因此,标题中的问题 - 我如何创建一个等待多个异步 WCF 调用完成的单个后台线程?

我尝试过但失败的事情:

  • 使用Async/Await模式。Visual Studio 说字节数组是不可等待的。我不知道如何破解我的出路。
  • 使用BackgroundWorker. 使用这种方法,我无法弄清楚如何发出进程结束的信号。因为 WCF 调用使用回调,所以我不再有权访问DoWorkEventArgsWCF 服务调用何时返回。
4

1 回答 1

0

在我开始之前,这在技术上并不构成答案。该站点限制了我可以在评论中添加的文本数量,因此我将其发布为答案。

所以:

我玩过各种方法。理想的解决方案似乎是一个成熟的多线程模型,它会阻塞直到异步调用返回。当线程可能不会存活超过一两秒(假设与服务器通信良好)时,这似乎是一种非常严厉的方法,但在极少数情况下可能会存活几分钟。它必须是一个阻塞线程,因为在异步模型中,后台工作人员会在调用服务器之后和调用的回调被触发之前死掉。

我现在使用的解决方案是将来自服务器的所有数据放入队列中,并在队列有项目时启动后台工作程序。后台工作人员将项目保存到数据库中,然后将项目添加到模型中,进而触发更新 UI 的事件。

队列方法有一个严重的缺陷,如果应用程序在下载完所有内容后终止,但在后台工作人员设法使所有项目出队并处理所有项目之前,这些项目将丢失给客户端,因为服务器假定它们已同步。

解决这个问题的所有方法都让我觉得很混乱(例如,一旦出队并保存,就回调服务器,确认同步,或保存,然后入队和处理),因此仍然非常欢迎任何其他建议。

于 2013-01-30T11:38:30.560 回答