C #, как реализовать класс, который работает с элементами управления и включить многопоточность? - PullRequest
0 голосов
/ 29 марта 2011

Я написал класс, который заполняет дерево. В моем проекте мне нужно это древовидное представление несколько раз, и я не хочу копировать, вставлять свой код, поэтому я решил создать класс, который заполнит древовидное представление для меня.

В некоторых формах я хочу использовать поток для заполнения дерева. Это потому, что иногда загрузка данных и заполнение дерева может занять некоторое время.

В моем классе дерева я передаю дерево в конструкторе. На данный момент я хочу заполнить дерево, я вызываю метод LoadTreeview().

Я хотел бы вызвать метод LoadTreeview в потоке, но когда я делаю это, я получаю исключение, что представление дерева создается в другом потоке. Что логично, конечно. Но мне было интересно, как лучше создать собственный класс, который работает с элементами управления, и вы хотите использовать этот класс в потоке?

Нужно ли писать этот код на каждом «GUI-действии»?

treeview.Invoke((MethodInvoker)delegate
{
  treeview.Nodes.Add(MyNode);
})

Или есть другие (более умные) способы?

Ответы [ 2 ]

2 голосов
/ 29 марта 2011

Как ваше решение, так и решения Levisaxos предотвратят сбой, но вы должны действительно оценить производительность во время выполнения. Проблема в том, что если вы вставляете много узлов в древовидное представление, и каждый узел вставляется через Control.Invoke, ваш код не будет делать много, но синхронизируется с потоком пользовательского интерфейса. В этом случае вам следует рассмотреть возможность отдельной загрузки данных, необходимых для создания узлов для древовидного представления, и фактической вставки узлов. Вместо этого загрузите данные асинхронно, а затем синхронно вставьте все узлы одновременно.

0 голосов
/ 29 марта 2011
public delegate TreeView updateLabelDelegate(TreeView view);
private TreeView InvokeTreeView(TreeView view)
{
    if (view.InvokeRequired)
    {
        view.Invoke(new updateLabelDelegate(InvokeTreeView), new object[] { view });
        return null;
    }
    else
    {
        return view;                
    }
}

Надеюсь, это поможет вам. Вот как я выполняю асинхронные операции.

[править] В зависимости от того, как вы хотите его использовать. В теме:

public TreeView thistreeviewsucks;
void SomeThread()
{
     TreeView tv = new TreeView();
     tv.Items.Add("something");
     //upon completion
     this.thistreeviewsucks = InvokeTreeView(tv);
}

Насколько я знаю, это сработает.

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