在一个新线程上打开一个标签项

本文关键字:一个 标签 新线程 线程 | 更新日期: 2023-09-27 18:08:12

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

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

我想使用ThreadPool:

ThreadPool.QueueUserWorkItem(new WaitCallback(HandleNewTabItem),sender);
private void HandleNewTabItem(object sender)
{
    //Adding tabs...
}

Thread上运行TabItem是正确的吗?

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

编辑:

这样做的主要原因是,我有很多处理在我的标签中进行,用户可以添加越来越多的标签…所以我需要一种方法来处理所有的处理,仍然保持我的UI响应。

在一个新线程上打开一个标签项

您不能肯定地说,ThreadPool是否会为每个选项卡使用不同的线程。

我认为它不适合你的任务。尝试使用TaskFactory的Task类:
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;

:

为什么要为每个选项卡创建一个线程?此操作非常消耗内存,并且,如果线程数大于系统的内核数,则由于windows上下文切换而造成额外的性能损失。

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

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

看看这篇博文:多线程UI: HostVisual

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