2011-06-30 13 views
0

我試着去創建一個方法,讓我在一個連續的流保存即示例代碼:Silverlight的WCF數據服務保存按順序

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,但還沒有擺弄周圍得到它會這麼我想我會問。這裏是我的即時存檔方法的最後一次迭代:

#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

在Silverlight中你不能阻止UI線程,否則應用程序將無法處理其他事情的任何用戶輸入,網絡和一堆。它也會凍結瀏覽器窗口。總而言之,用戶體驗非常糟糕。

對此進行編程的建議方法是使用回調,這意味着您的代碼被拆分爲幾個部分(幾個方法或委託)。

查看Visual Studio的異步CTP(http://www.microsoft.com/download/en/details.aspx?displaylang=en & id = 9983),這使得這一切變得更加容易。它可以讓你幾乎像你一樣編寫代碼,編譯器會爲你分割所有的回調。

如果你真的需要阻塞,那麼你可以在SL中啓動一個後臺線程並在那裏執行,但是你必須記住異步API(比如BeginSaveChanges)的回調將在不同的線程上執行(depends在API上,有時它是UI線程,有時它是另一個後臺線程)。

0

不要試圖強制它變得同步,但使用回調函數。

例如:您可以將原始調用拆分爲兩個方法調用,並將第二個部分設置爲保存的回調。當然,你需要更新你的保存方式,但這不應該太難。

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