Ждите вопроса - PullRequest
       14

Ждите вопроса

3 голосов
/ 18 ноября 2009

У меня есть UserControl с деревом на нем. Он использует многопоточность для добавления узлов к нему. У меня есть функция под названием Expand, которую нужно выполнить после завершения фильтрации, и, поскольку я новичок с многопоточностью, я не уверен, как это сделать. Вот мой код:

class MyClass : UserControl
{
    private Thread nThread;
    private bool searchLoadCompleted = false;

    private void Filter()
    {
        ClearTree();
        this.nThread = new Thread(new ParameterizedThreadStart(AddFilteredResultsToTree));
        this.nThread.IsBackground = true;
        this.nThread.Start(someParameter);
    }

    private void AddFilteredResultsToTree(int someParameter)
    {
        myTree.Invoke(new MethodInvoker( ()=> this.searchLoadCompleted = false ));
        myTree.Invoke(new MethodInvoker( ()=> AppendNode(......) ));
        myTree.Invoke(new MethodInvoker( ()=> this.searchLoadCompleted = true ));
    }   

    private void Expand()
    {
    }
}

Я пытался добавить nThread.Join() в Expand(), но он застрял на неопределенное время. Что мне делать?

Ответы [ 2 ]

2 голосов
/ 18 ноября 2009

Если это однопоточная версия:

ClearTree();
AddFilteredResultsToTree(someparameter);
Expand();

Не беспокойтесь о многопоточности, просто сделайте это в одном потоке. Смысл использования многопоточности - позволить главному потоку обрабатывать события пользовательского интерфейса. Если вы присоединяетесь к потоку, то вы просто запускаете фоновый поток, замораживая (не выполняя никакой работы) основной поток. Обратите внимание, что вызывая Invoke, вы все равно делегируете выполнение AddFilteredResultsToTree основному потоку.

Я бы посоветовал вам просто вызвать Expand from AddFilteredResult и использовать Dispatcher для обновления пользовательского интерфейса при необходимости или.

Другим способом (лучше всего, на мой взгляд) было бы использовать Async Pattern для этого (пример и учебное пособие здесь ), а затем в AsyncCallback обновить пользовательский интерфейс.

1 голос
/ 18 ноября 2009

Вызов Invoke заблокирует как поток GUI, так и ваш рабочий поток, поэтому не будет никакого улучшения производительности по сравнению с кодом без рабочего потока.

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