[英]Silverlight WCF Data Services Save Sequentially
我试图创建一个允许我保存在顺序流中的方法,即示例代码:
Private sub BlahWithSave()
'PERFOR ACTIONS
Blah()
Blah2()
'SAVE CHANGES TO DB
General.SaveState()
'CARRY ON PERFORMING ACTIONS AFTER SAVE CARRIED OUT
Blah3()
Blah4()
End Sub
目前我一直在处理 ManualResetEvent 和 AutoResetEvent 但还没有开始,所以我想我会问。 这是我对 SaveState 方法的最后一次迭代:
#Region " SAVE CHANGES "
Private Shared ManualWaitEvent As System.Threading.ManualResetEvent
Public Shared Sub SaveState()
ManualWaitEvent = New System.Threading.ManualResetEvent(False)
MyDataContext.BeginSaveChanges(Sub(result As IAsyncResult)
ManualWaitEvent.Set()
Deployment.Current.Dispatcher.BeginInvoke(Sub()
Dim response As DataServiceResponse = MyDataContext.EndSaveChanges(result)
End Sub)
End Sub, MyDataContext)
ManualWaitEvent.WaitOne()
End Sub
#End Region
问题是它只是停在 ManualWaitEvent.WaitOne 并且永远不会进入 BeginSaveChanges 回调。 关于我哪里出错的任何想法? 或者关于我如何实现这一点的另一个想法。
谢谢
在 Silverlight 中,您不能阻塞 UI 线程,否则应用程序将无法处理任何用户输入、网络和其他一些事情。 它还将冻结浏览器 window。 总而言之,用户体验非常糟糕。
建议的编程方法是使用回调,这意味着您的代码被分成几个部分(几个方法或委托)。
看看 Visual Studio 的异步 CTP (http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=9983),它使其中一些变得更容易。 它允许您几乎像以前一样编写代码,并且编译器会为您完成所有拆分为回调。
如果你真的需要阻塞,那么你可以在 SL 中启动一个后台线程并在那里执行,但是你必须记住来自异步 API(如 BeginSaveChanges)的回调将在不同的线程上执行(取决于 API,有时是 UI 线程,有时是另一个后台线程)。
不要试图强迫它变得同步,而是使用回调函数。
例如:您可以将原始调用拆分为两个方法调用,并将第二部分设置为保存的回调。 当然,您需要更新保存方式,但这应该不会太难。
Private sub BlahWithSave()
'PERFOR ACTIONS
Blah()
Blah2()
'SAVE CHANGES TO DB
General.SaveState(BlahWithSavePart2)
End Sub
Private sub BlahWithSavePart2()
'CARRY ON PERFORMING ACTIONS AFTER SAVE CARRIED OUT
Blah3()
Blah4()
End Sub
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.