在一个新线程上打开一个标签项
本文关键字:一个 标签 新线程 线程 | 更新日期: 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的类,并且这些内容在它自己的线程中处理。