Из документации MSDN на System.Windows.Forms.TreeView :
Любая общедоступная статическая ( Общая в Visual
Основные) члены этого типа являются потоками
безопасный. Любые члены экземпляра не являются
гарантированно безопасен для потоков.
К счастью для вас, в Windows Forms есть механизм для обработки элементов управления из нескольких потоков безопасным для потоков способом:
public delegate void TreeActionDelegate(WhatToDo details);
public void DoSomethingWithThisTree(WhatToDo details)
{
// Assuming that 'this' points to a TreeView
if (this.InvokeRequired) this.Invoke(new TreeActionDelegate(),
new object[] { details });
else
{
// The body of your function
}
}
Теперь вы можете вызывать эту функцию из любого потока:
DoSomethingWithThisTree(new WhatToDo("something"));
Это гарантирует, что код, управляющий вашим деревом, будет выполняться в потоке, который создал TreeView, следовательно, он будет поточно-ориентированным. Если вы не хотите наследовать от TreeView, вы можете просто использовать treeInstance.InvokeRequired
и treeInstance.Invoke(
).