#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 что плохого в том, чтобы просто добавить узел напрямую?