我正在尝试创建一种方法,允许我以顺序流保存,即示例代码:
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回调。你知道我哪里错了吗?或者是关于我如何完成这个的另一个想法。
谢谢
发布于 2011-06-30 19:59:25
在Silverlight中,你不能阻塞UI线程,否则应用程序将无法处理任何用户输入、网络和其他事情。它还将冻结浏览器窗口。总而言之,这是一个非常糟糕的用户体验。
建议的编程方式是使用回调,这意味着您的代码将被分成几个部分(或者几个方法,或者是委托)。
看看async CTP for Visual Studio (http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=9983),它让这一切变得简单得多。它允许您像以前一样编写代码,编译器会为您完成所有拆分成回调的工作。
如果你真的需要阻塞,那么你可以在SL中启动一个后台线程,然后在那里执行,但是你必须记住,异步API(如BeginSaveChanges)的回调将在不同的线程上执行(取决于API,有时是UI线程,有时是另一个后台线程)。
发布于 2011-07-01 01:13:48
不要试图强制它变得同步,而要使用回调函数。
例如:您可以将原始调用拆分为两个方法调用,并将第二部分设置为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 Subhttps://stackoverflow.com/questions/6528903
复制相似问题