Открыть вкладку в новой теме? - PullRequest
1 голос
/ 08 сентября 2011

Я хочу добавить новый TabTtems к моему TabControl, но каждый TabItem должен работать самостоятельно thread.

Каков наилучший способ добиться этого?

Я думал об использовании ThreadPool:

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

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

Это правильный способ запуска TabItem на своем собственном Thread?

Если нет, что делатьВы предлагаете?

РЕДАКТИРОВАТЬ:

Основная причина этого заключается в том, что у меня есть много обработки, происходящей в моих вкладках, и пользователь может добавлять все больше и больше вкладок... Так что мне нужен способ справиться со всей обработкой и при этом поддерживать отзывчивость моего пользовательского интерфейса.

Ответы [ 2 ]

2 голосов
/ 08 сентября 2011

Вы не можете сказать, для sertain, будет ли ThreadPool использовать разные потоки для каждой вашей вкладки.

Я не думаю, что это подходит для вашей задачи.Попробуйте использовать Task class с 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: Да, ваш графический интерфейс будетотзывчивый, поскольку задачи выполняются с внутренними вызовами к объекту пула потоков, и вы можете создавать новые задачи с помощью TaskFactory.

1 голос
/ 08 сентября 2011

Посмотрите на это сообщение в блоге: Многопоточный пользовательский интерфейс: HostVisual

В нем описывается, как реализовать свой собственный класс, который наследуется от FrameworkElement, и это содержимое обрабатывается в его собственном потоке.

...