在新线程上打开Tab项?

时间:2011-09-08 10:49:05

标签: c# winforms multithreading tabcontrol threadpool

我想向我的TabTtems添加新的TabControl,但每个TabItem必须在其自己的thread上运行。

实现这一目标的最佳方式是什么?

我想过使用ThreadPool

ThreadPool.QueueUserWorkItem(new WaitCallback(HandleNewTabItem),sender);

private void HandleNewTabItem(object sender)
{
    //Adding tabs...
}

这是在TabItem上运行Thread的正确方法吗?

如果没有,你有什么建议?

修改

主要原因是,我在我的标签中进行了大量处理,用户可以添加越来越多的标签...所以我需要一种方法来处理所有处理并仍然保持我的UI响应。< / p>

2 个答案:

答案 0 :(得分:2)

你不能说,ThreadPool会为你的每个标签使用不同的线程。

我觉得它不适合你的任务。尝试使用Taskwith TaskFactory

Task<double>[] taskArray = new Task<double>[]
   {
       Task<double>.Factory.StartNew(() => DoComputation1()),

       // May be written more conveniently like this:
       Task.Factory.StartNew(() => DoComputation2()),
       Task.Factory.StartNew(() => DoComputation3())                
   };

double[] results = new double[taskArray.Length];
for (int i = 0; i < taskArray.Length; i++)
    results[i] = taskArray[i].Result;

<强>更新

为什么要为每个标签创建单个线程?此操作非常耗费内存,并且,如果线程数大于系统中的核心数,则由于窗口上下文切换而导致额外的性能损失。

这就是我建议您为应用程序使用任务的原因 - 如果任务数量大于核心数,您可以使用ContinueWith方法等待结果。

关于您的问题来自cooment:是的,您的GUI将响应,因为任务正在执行内部调用线程池对象,您可以自由地创建TaskFactory的新任务。

答案 1 :(得分:1)

查看此博文:Multithreaded UI: HostVisual

它描述了如何实现自己继承自FrameworkElement的类,并且这些内容在自己的线程中处理。