делегировать метод с несколькими сигнатурами

#c# #c#-2.0

#c# #c #-2.0

Вопрос:

Как мне добавить метод с сигнатурой в поток?

Я пытаюсь добавить элемент в графический интерфейс TreeView, используя метод testAdd(DirectoryEntry d, TreeNode t)

Я сделал это как обычное создание потока:

 Thread t1;
t1 = new Thread(new ThreadStart(testAdd(directory,rootNode));t1.Start();
t1=new Thread(delegate() {testAdd(directory, rootNode);})
t1.start();
  

Я получаю сообщение об ошибке, указывающее мне использовать invoke.

Как это можно решить?

Комментарии:

1. Вы не должны получать доступ к элементам пользовательского интерфейса из потока, в котором они не были созданы. Если вы все равно хотите это сделать, вам придется использовать Invoke метод. На самом деле это не имеет ничего общего с C #, только с WinForms.

2. Вы не можете напрямую добавлять элементы в treeview с помощью кода, который выполняется в потоке. Элементы управления не являются потокобезопасными. Используйте класс BackgroundWorker.

3. В случае WPF вы можете сделать то же самое с помощью Dispatcher. URL : weblogs.asp.net/pawanmishra/archive/2010/06/06 /…

4. в моем случае мне нужно несколько потоков и Windows forms

Ответ №1:

Проблема, с которой вы столкнулись, заключается в том, что вы не можете получить доступ к элементам пользовательского интерфейса из фонового потока в приложении WinForms. В используемой вами сигнатуре нет ничего плохого, вы просто выполняете незаконную операцию над элементом пользовательского интерфейса. Фактическая мутация элемента пользовательского интерфейса должна происходить в пользовательском интерфейсе / главном потоке приложения. Новый Thread экземпляр гарантирует, что это не будет правдой.

Можно выполнить работу по вычислению того, что вы добавите в фоновый поток, а затем использовать Invoke для возврата к потоку пользовательского интерфейса. Но фактическое добавление должно произойти в пользовательском интерфейсе.

Комментарии:

1. спасибо, ребята, можете ли вы дать мне пример кода добавления узла в моем случае??

2. @user1015633 что плохого в том, чтобы просто добавить узел напрямую?