Многопоточность Silverlight 4 - PullRequest
2 голосов
/ 14 мая 2010

Я пытаюсь обновлять интерфейс Silverlight 4 каждые полсекунды новыми данными. Я подключился к сервису WCF, используя привязку net.tcp и выдачу обратных вызовов с сервера. Чтобы я как можно быстрее получал данные из службы, я запустил свой прокси-сервер на рабочем столе в приложении Silverlight.

Мой вопрос: как мне получить результаты обратного вызова и обновить ObservableCollection, которая связана с птицей данных? Я пробовал несколько разных способов и продолжаю получать страшную ошибку перекрестного потока.

Ответы [ 2 ]

3 голосов
/ 14 мая 2010

Используйте Dispatcher BeginInvoke.Например: -

 private void MyCallback(object sender, SomeArgsClass e)
 {
     // perhaps some extraction of a payload or something
     Deployment.Current.Dispatcher.BeginInvoke( () =>
     {
        // Code you need to run on the UI thread.
     });

     // Note code may or may not exit here before code above has completed.
     // So be careful with disposable types etc.
 }
2 голосов
/ 14 мая 2010

Существует несколько подходов:

  • используйте Deployment.Current.Dispatcher из фонового потока и выполните Deployment.Current.Dispatcher.CheckAccess () для него

  • передает диспетчер из компонента пользовательского интерфейса, который запускает фоновый поток, и использует этот дескриптор для выполнения CheckAccess () call

  • это мой предпочтительный вариант: передать делегат (обратный вызов) в фоновый поток, когда у него появляются новые данные, он вызывает этот делегат, и этот делегат живет в элементе управления пользовательского интерфейса - он может затем использовать диспетчер, доступный пользовательский интерфейс

Шаблон для такого рода вещей:

private void DoMyUIUpdate(List<object> updates)
{
    if (Deployment.Current.Dispatcher.CheckAccess())
    {
        //do my work, update the UI
    }
    else
        Deployment.Current.Dispatcher.BeginInvoke(new Action<List<object>>(DoMyUIUpdate), updates);
}
...