Блокировка метода add () ObservableCollection - PullRequest
2 голосов
/ 22 июля 2011

Я работаю над проектом (C # и WPF), где некоторые серверы добавляются в список следующим образом:

ObservableCollection<ServerObjects> servers;
ServerObjects so = getServers();
servers->add(so);

Моя проблема заключается в том, что эта функция блокирует, и хотя элементы добавляются в мой список, я не могу выбрать ни один из них только после завершения генерации (также программа зависает).

Итак, что я должен сделать, чтобы сделать эту функцию асинхронной?

Спасибо.

Ответы [ 2 ]

1 голос
/ 22 июля 2011
void addServers(ObservableCollection<ServerObjects> ACollection)
{
    //For Common szenarios dont use new Thread() use instead ThreadPool.QueueUserWorkItem(..) or  the TaskFactory
    Task.Factory.StartNew(()=> this.LoadServer());
}

void MyThreadMethod(Object obj)
{
    ServerObjects so = getServers();

    // The invoke is important, because only the UI Thread should update controls or datasources which are bound to a Control
    UIDispatcher.Invoke(new Action(()=> (obj as ObservableCollection).add(so));
}

Вы также можете на RX вернуть IObservable подписку на TaskScheduler и наблюдать на Dispatcher.

-> Пул потоков против создания собственной темы -> Создание более отзывчивых приложений с помощью Dispatcher

0 голосов
/ 22 июля 2011

Как это?:

void addServers(ObservableCollection<ServerObjects> ACollection)
{
    Thread T = new Thread(new ParameterizedThreadStart(MyThreadMethod));
    T.Start(ACollection);
}

void MyThreadMethod(Object obj)
{
    ServerObjects so = getServers();
    (obj as ObservableCollection).add(so);
}

Загрузка серверов теперь выполняется в другом потоке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...