2011-09-08 26 views
1

我想为我的TabControl添加新的TabTtems,但每个TabItem都必须运行在它自己的thread上。在新线程上打开一个Tab项目?

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

我想到了用ThreadPool的:

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

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

这是运行在它自己的Thread一个TabItem这个正确的方式?

如果不是,你有什么建议?

编辑:

造成这种情况的主要原因是,我已经配发处理在我的标签回事,用户可以添加更多标签,所以,我需要一种方法来处理所有的处理并仍然保持我的UI响应。

回答

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; 

UPDATE

你为什么要创建为每个标签的单个线程?这种操作非常耗费内存,并且如果线程数量大于系统中的内核数量,则由于Windows上下文切换而导致额外的性能降低。

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

关于你从cooment的问题:是的,你的GUI将会有响应,因为这些任务是通过内部对线程池对象的调用执行的,你可以自由地通过你的TaskFactory创建新的任务。

+0

感谢您的回复。主要原因是,我在我的选项卡中进行了一系列处理,用户可以添加越来越多的选项卡......所以我需要一种方法来处理所有的处理,并保持我的UI响应。话虽如此,“Task”班会为我工作吗? – Willem

+1

@Willem更新了答案。 – VMAtm

+0

听起来不错。谢谢 – Willem

相关问题