我试图创建一个方法,允许我保存在顺序流程中,例如代码:
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回调。关于我哪里出错的任何想法?或者关于我如何能够实现这一点的另一个想法。
由于
答案 0 :(得分:0)
在Silverlight中,您不能阻止UI线程,否则应用程序将无法处理任何用户输入,网络和其他一些东西。它还会冻结浏览器窗口。总而言之,用户体验非常糟糕。
建议的编程方法是使用回调,这意味着你的代码被分成几个部分(几个方法或代理)。
查看Visual Studio的异步CTP(http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=9983),这使得其中一些变得更加容易。它允许你几乎像你一样编写代码,并且编译器会为你完成所有分解为回调。
如果你真的需要阻止,那么你可以在SL中启动后台线程并在那里执行,但是你必须记住来自异步API(如BeginSaveChanges)的回调将在不同的线程上执行(依赖于API,有时它是UI线程,有时它是另一个后台线程。)
答案 1 :(得分:0)
请勿尝试强制它变为同步但使用回叫功能。
例如:您可以将原始调用拆分为两个方法调用,并将第二个部分设置为save的回调。当然,你需要更新你的保存方式,但这不应该太难。
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