Службы данных 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, но у меня ничего не получилось, поэтому я подумал, что спрошу. Вот моя последняя итерация метода 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. Есть идеи, где я ошибаюсь? Или еще одна идея о том, как я могу это сделать.

Спасибо


person HackAndSlasher    schedule 30.06.2011    source источник


Ответы (2)


В Silverlight вы не должны блокировать поток пользовательского интерфейса, иначе приложение не сможет обрабатывать какой-либо пользовательский ввод, работу в сети и множество других вещей. Это также заморозит окно браузера. В целом, действительно плохой пользовательский опыт.

Предлагаемый способ запрограммировать это - использовать обратные вызовы, что означает, что ваш код разбивается на несколько частей (либо несколько методов, либо делегатов).

Взгляните на асинхронный CTP для Visual Studio (http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=9983), который упрощает некоторые из этих задач. Это позволяет вам писать код почти так же, как вы, а компилятор делает все разбиение на обратные вызовы за вас.

Если вам действительно нужно заблокировать, вы можете запустить фоновый поток в SL и сделать это там, но тогда вы должны помнить, что обратные вызовы из асинхронных API (например, BeginSaveChanges) будут выполняться в другом потоке (в зависимости от API, иногда это поток пользовательского интерфейса, иногда другой фоновый поток).

person Vitek Karas MSFT    schedule 30.06.2011

Не пытайтесь заставить его стать синхронным, используйте функции обратного вызова.

Например: вы можете разделить исходный вызов на два вызова методов и установить вторую часть как обратный вызов для сохранения. Конечно, вам нужно будет обновить способ сохранения, но это не должно быть слишком сложно.

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
person Danexxtone    schedule 30.06.2011