Silverlight WCF数据服务按顺序保存

Silverlight WCF数据服务按顺序保存,silverlight,wcf,odata,wcf-data-services,Silverlight,Wcf,Odata,Wcf Data Services,我正在尝试创建一种方法,允许我以顺序流保存,即示例代码: 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 目前,我一直在胡闹手动重置事件和自动重置事件,但还没有得到它去,所以我想我会问。下

我正在尝试创建一种方法,允许我以顺序流保存,即示例代码:

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
目前,我一直在胡闹手动重置事件和自动重置事件,但还没有得到它去,所以我想我会问。下面是我对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线程,否则应用程序将无法处理任何用户输入、网络和其他事情。它还将冻结浏览器窗口。总而言之,这是一个非常糟糕的用户体验

建议的编程方法是使用回调,这意味着您的代码将被分成几个部分(几个方法或委托)

看看VisualStudio的异步CTP(http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=9983)这使得其中一些更容易。它允许您几乎像以前一样编写代码,并且编译器会为您将所有代码拆分为回调


如果您确实需要阻塞,那么您可以在SL中启动一个后台线程并在那里执行,但是您必须记住,来自异步API(如BeginSaveChanges)的回调将在不同的线程上执行(取决于API,有时是UI线程,有时是另一个后台线程).

不要试图强制它变为同步,而是使用回调功能

例如:可以将原始调用拆分为两个方法调用,并将第二部分设置为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