情景:
我正在使用数据库创建和填充Treelist。
这是一项相当耗时的任务,并且不想挂gui(也没有任何“进度条”等)。
所以我决定将所有这些都转移到Backgroundworker,但由于我无法从另一个线程更新树,然后创建它的人我在后台线程中创建一个临时树,完成后只需复制整个内容到GUI显示的树。
编辑:我知道在后台线程中填充GUI组件的'hack',但是因为我刚刚被投入到这个项目中并且要求在非常有限的时间内“停止gui经常挂起”框架,重写数据的加载和创建实际上不是一个选项(尽管这将是最好的做法)。 我刚刚更改了“CreateTree”函数以在新线程中运行,将新创建的树传递给“ThreadComplete”并复制它。
干杯
答案 0 :(得分:1)
UI元素(如TreeView)应该保留在UI的末尾。这有技术原因 - Windows不允许从任何线程更新UI元素,但主UI线程 - 但也有架构原因:您的后端数据库访问代码不应与任何特定的UI实现紧密耦合。如果您决定通过DevExpress或任何其他供应商从TreeList切换到其他控件,则必须在整个系统中替换代码。
您要做的是让您的后端代码创建更通用的数据结构,例如具有分层结构的业务对象列表,如下所示:
public class MyBusinessObject
{
public string Name {get;set;}
public List<MyBusinessObject> ChildObjects {get;}
}
并从后台线程返回MyBusinessObject
的列表。此列表应使用数据绑定连接到TreeList。你没有指定你正在使用的UI平台 - XtraaTreeList是一个WinForms控件,对吧? - 但是所有常见的框架都有数据绑定选项来将这个业务对象列表绑定到UI控件,而不是让你自己完成所有的工作。
答案 1 :(得分:0)
为了从另一个线程更新一个组件,你可以使用SynchronizationContext,然后像在同一个线程中那样遍历它。