Silverlight WCF数据服务按顺序保存

时间:2011-06-30 00:50:37

标签: 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

目前我一直在使用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回调。关于我哪里出错的任何想法?或者关于我如何能够实现这一点的另一个想法。

由于

2 个答案:

答案 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