我的场景包含.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
。答案 0 :(得分:0)
在开始之前,这在技术上并不构成答案。此网站限制了我可以在评论中添加的文字数量,因此我将其作为答案发布。
所以:
我已经采用了各种方法。理想的解决方案似乎是一个完整的多线程模型,它会阻塞,直到异步调用返回。当线程可能无法存活超过一两秒时(假设服务器通信良好),这似乎是真正严厉的方法,但在极少数情况下可能会持续几分钟。它必须是一个阻塞线程,因为在异步模型中,后台工作者在调用服务器之后就会死掉,并且在调用call的回调之前就会死掉。
我现在使用的解决方案是将从服务器下来的所有数据放入队列,并在队列有项目时启动后台工作程序。后台工作程序将项目保存到数据库,然后将项目添加到模型,从而触发更新UI的事件。
队列方法有一个严重的缺陷,如果应用程序在所有内容被下载后终止,但在后台工作人员设法出列并处理所有项目之前,这些项目将丢失给客户端,因为服务器假定他们已同步。
解决这个问题的所有方法都让我感到麻烦(例如,一旦出列并保存,确认同步,或保存,然后排队和处理,回叫服务器),所以任何其他建议仍然非常受欢迎。< / p>