Ich habe eine Multithread-App, und ich muss ein Objekt aus einem anderen Thread zur Baumansicht hinzufügen. Aber ich bekomme immer eine AusnahmeSo fügen Sie ein Objekt in der Baumansicht eines anderen Threads hinzu
Aktion, die für dieses Steuerelement ausgeführt wird, wird aus dem falschen Thread aufgerufen. Marschall zum richtigen Thread mit Control.Invoke oder Control.BeginInvoke, um diese Aktion durchzuführen.
Hier ist mein Code
ThreadPool.QueueUserWorkItem(new WaitCallback(GetFiles), entryPoint);
private void GetFiles(object entryPoint)
{
var localData = entryPoint as EntryPoint;
this.GetFiles(localData.DirectoryInfo, localData.TreeNode);
localData.ManualEvent.Set();
}
private void GetFiles(DirectoryInfo directory, TreeNode tree)
{
for (int i = 0; i < allFiles.GetLength(0); i++)
{
tree.Nodes.Add(allFiles[i].Name);
}
}
Dies ist eine Standardnachricht. Sie können Elemente, die vom UI-Thread aus einem Nicht-UI-Thread erstellt wurden, nicht ändern. Verwenden Sie BeginInvoke() mit einem anonymen Delegaten oder einem gewöhnlichen Delegaten auf dem Hauptformular von Ihrem Thread. Ich denke, Lambda und Linq bieten sogar bessere Methoden. – icbytes
Ich mache mit Hilfe von Delegat, aber immer noch eine Ausnahme öffentlichen Delegat void MyDelagate (TreeNode Baum, String-Wert); public MyDelagate TreeViewDelegate; TreeViewDelegate = Delegat (TreeNode-Struktur, Zeichenfolge s) { tree.Nodes.Add (s); }; TreeViewDelegate.Invoke (Baum, allFiles [i] .Name); – Ilia
IMHO müssen Sie 'ThreadPool' überhaupt nicht verwenden. Rufen Sie einfach die Methode im UI-Thread auf. Ihre Methode macht keine nennenswerte Arbeit. –