如何创建一个等待多个异步WCF调用完成的后台线程?

时间:2013-01-28 16:48:45

标签: vb.net multithreading wcf asynchronous

我的场景包含.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调用使用回调,因此当WCF服务调用返回时,我无法再访问DoWorkEventArgs

1 个答案:

答案 0 :(得分:0)

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

所以:

我已经采用了各种方法。理想的解决方案似乎是一个完整的多线程模型,它会阻塞,直到异步调用返回。当线程可能无法存活超过一两秒时(假设服务器通信良好),这似乎是真正严厉的方法,但在极少数情况下可能会持续几分钟。它必须是一个阻塞线程,因为在异步模型中,后台工作者在调用服务器之后就会死掉,并且在调用call的回调之前就会死掉。

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

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

解决这个问题的所有方法都让我感到麻烦(例如,一旦出列并保存,确认同步,或保存,然后排队和处理,回叫服务器),所以任何其他建议仍然非常受欢迎。< / p>