繁体   English   中英

C#如何实现一个使用控件并启用线程的类?

[英]C# how to implement a class that works with controls and enable threading?

我写了一个为我填写树视图的课程。 在我的项目中,我需要多次这个树视图而且我不想复制粘贴我的代码,所以我决定创建一个为我填充树视图的类。

在某些表单上,我想使用一个线程来填充树视图。 这是因为有时可能需要一些时间来加载数据并填充树视图。

在我的treeview-class中,我在构造函数中传递了treeview。 目前我想填充树视图,我调用LoadTreeview()方法。

我想在一个线程上调用LoadTreeview方法,但是当我这样做时,我得到了另一个线程上创建树视图的异常。 这偏离逻辑。 但我想知道,创建一个使用控件的自定义类的最佳方法是什么,并且你想在一个线程中使用这个类?

我是否需要在每个'GUI-action'上编写此代码?

treeview.Invoke((MethodInvoker)delegate
{
  treeview.Nodes.Add(MyNode);
})

还是有其他(更智能)的方式?

您和Levisaxos的解决方案都可以防止崩溃,但您应该对此运行时性能进行基准测试。 问题是,如果向树视图中插入大量节点,并且每个节点都是通过Control.Invoke插入的,那么除了与UI线程同步之外,您的代码不会做太多工作。 如果是这种情况,您应该考虑从实际插入节点中单独加载为树视图创建节点所需的数据。 而是异步加载数据,然后同时插入所有节点。

public delegate TreeView updateLabelDelegate(TreeView view);
private TreeView InvokeTreeView(TreeView view)
{
    if (view.InvokeRequired)
    {
        view.Invoke(new updateLabelDelegate(InvokeTreeView), new object[] { view });
        return null;
    }
    else
    {
        return view;                
    }
}

我希望这可以帮助你。 这就是我如何处理异步操作。

[编辑]取决于您想如何使用它。 在一个帖子中:

public TreeView thistreeviewsucks;
void SomeThread()
{
     TreeView tv = new TreeView();
     tv.Items.Add("something");
     //upon completion
     this.thistreeviewsucks = InvokeTreeView(tv);
}

据我所知,这将有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM