[英]Silverlight WCF Data Services Save Sequentially
我試圖創建一個允許我保存在順序流中的方法,即示例代碼:
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 回調。 關於我哪里出錯的任何想法? 或者關於我如何實現這一點的另一個想法。
謝謝
在 Silverlight 中,您不能阻塞 UI 線程,否則應用程序將無法處理任何用戶輸入、網絡和其他一些事情。 它還將凍結瀏覽器 window。 總而言之,用戶體驗非常糟糕。
建議的編程方法是使用回調,這意味着您的代碼被分成幾個部分(幾個方法或委托)。
看看 Visual Studio 的異步 CTP (http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=9983),它使其中一些變得更容易。 它允許您幾乎像以前一樣編寫代碼,並且編譯器會為您完成所有拆分為回調。
如果你真的需要阻塞,那么你可以在 SL 中啟動一個后台線程並在那里執行,但是你必須記住來自異步 API(如 BeginSaveChanges)的回調將在不同的線程上執行(取決於 API,有時是 UI 線程,有時是另一個后台線程)。
不要試圖強迫它變得同步,而是使用回調函數。
例如:您可以將原始調用拆分為兩個方法調用,並將第二部分設置為保存的回調。 當然,您需要更新保存方式,但這應該不會太難。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.