2011-12-21 53 views
0

我有一个TreeView,有很多节点。我有一个后台工作人员遍历节点并添加节点,或更新Checked属性。如果我将节点作为参考传递给后台线程(我使用SyncronizationContext类来更新在主线程上创建的控件),是否可以从后台线程更新节点?只是好奇,如果我可以或不可以,因为它是很多编程改变,如果我可以/不能从我的后台线程做到这一点。从后台更新TreeView节点线程引用

+0

调查['Control.Invoke'方法(http://msdn.microsoft。 COM/EN-US /库/ zyzhdc6b.aspx),或['Control.BeginInvoke'](http://msdn.microsoft.com/en-us/library/system.windows.forms.control.begininvoke.aspx) 。 – 2011-12-21 16:24:05

+0

这又是一个适合虚拟控制 – 2011-12-21 16:25:42

回答

1

不能UI线程以外更新控制。但是您可以使用Application.Current.Dispatcher.Invoke(对于WPF)或Control.Invoke(对于WinForms)在UI线程上调用某个函数。你应该记住,这些操作将在主线程上执行,并且可以使你的应用程序没有响应,如果你尝试做一些耗时这里

+0

我使用的SynchronizationContext类更新主线程....不记得在那里我找到了另一条的情况,但代码是这样的: 私人只读的SynchronizationContext synContext = new AsyncOperationManager.SynchronizationContext; 为了进行调用,创建一个接受所需数据参数的方法,然后像这样调用(来自backgroundworker线程) syncContext.Post(delegate {OnUpdateUIControl(argsForUpdate);},null); – ganders 2011-12-21 19:16:43

+0

你的代码也应该可以正常工作(除非你的示例中不需要单词“new”) – Natalia 2011-12-21 20:37:16

+0

哦,是的,错过了......谢谢。 – ganders 2011-12-22 00:08:45