Службы данных Silverlight WCF последовательно сохраняются - PullRequest
0 голосов
/ 30 июня 2011

Я пытаюсь создать метод, который позволяет мне сохранять в последовательном потоке, например, пример кода:

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 голосов
/ 30 июня 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
0 голосов
/ 30 июня 2011

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

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

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

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

...