我想向我的TabTtems
添加新的TabControl
,但每个TabItem
必须在其自己的thread
上运行。
实现这一目标的最佳方式是什么?
我想过使用ThreadPool
:
ThreadPool.QueueUserWorkItem(new WaitCallback(HandleNewTabItem),sender);
private void HandleNewTabItem(object sender)
{
//Adding tabs...
}
这是在TabItem
上运行Thread
的正确方法吗?
如果没有,你有什么建议?
修改
主要原因是,我在我的标签中进行了大量处理,用户可以添加越来越多的标签...所以我需要一种方法来处理所有处理并仍然保持我的UI响应。< / p>
答案 0 :(得分:2)
你不能说,ThreadPool会为你的每个标签使用不同的线程。
我觉得它不适合你的任务。尝试使用Task班with 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的类,并且这些内容在自己的线程中处理。