【发布时间】:2011-02-17 15:29:42
【问题描述】:
我试图从我收到的应用程序中找出一些意义,以便追踪错误的来源。有一些代码(此处简化)创建了四个线程,这些线程依次填充主窗体上的列表视图。每个方法都从数据库中获取数据并从资源 dll 中检索图形,以便直接填充图像列表和列表视图。
根据我在此处阅读的内容 (link),不应从 UI 线程以外的任何线程更新 UI 元素,但这似乎可行?
Thread t0 = new Thread(new ThreadStart(PopulateListView1));
t0.IsBackground = true;
t0.Start();
Thread t1 = new Thread(new ThreadStart(PopulateListView2));
t1.Start();
Thread t2 = new Thread(new ThreadStart(PopulateListView3));
t2.Start();
Thread t3 = new Thread(new ThreadStart(PopulateListView4));
t3.Start();
错误本身是 System.InvalidOperationException “无法将图像添加到 ImageList。”这让我想知道上面的代码是否以某种方式链接。
是否推荐使用这种填充 UI 的方法,如果不推荐,可能会导致哪些并发症?
更新:
我可能通过引用“表格”给出了一些错误信息。该应用程序是一个 Windows 窗体应用程序,但代码来自基于用户控件的插件应用程序。线程是在此控件公开的初始化方法中创建的。列表视图等也是此插件用户控件的一部分。
【问题讨论】:
-
是您要填写此插件的 UI 控件,还是您希望填写另一个 UI 控件中的信息?
-
用户控件更像是一个单独的插件应用程序,它包含许多列表视图,正在更新的正是这些。
-
我明白了。你有这个插件UserControl的源码吗?
-
是的,宿主容器和用户控件都属于我们,但负责它们的开发人员已不在公司。用户控件中的初始化方法由容器调用,正是该方法创建了填充列表视图控件的线程。
-
我会建议也许尝试找出一种方法来调用 UI 线程,以便它可以填充控件,使用委托或任何我建议的解决方法。我的回答你清楚吗?
标签: c# .net multithreading user-interface