Используйте ThreadPool или Thread - PullRequest
4 голосов
/ 22 сентября 2011

У меня была 1 коллекция, которую я сохранял в постоянном хранилище. Затем у меня было 3 коллекции, которые я хотел бы сохранить в постоянном хранилище.

Сначала я использовал ThreadPool для сохранения одной коллекции, но теперь у меня есть 3 коллекции. Поскольку каждая коллекция отправляется в отдельное хранилище, я не хочу объединять их или сохранять в одном месте.

У меня вопрос, должен ли я использовать ручные потоки и создавать по одному потоку для каждого метода Save (), или мне нужно создать 3 пула потоков для каждого метода, или я должен вызвать все 3 метода в одном вызове ThreadPool.QueueUserWorkItem.

1.Первый подход

ThreadPool.QueueUserWorkItem(o => 
             { Save<Foo>(ConcurrentCollectionStorage.Bus1);
               Save<Bar>(ConcurrentCollectionStorage.Bus2);
               Save<Car>(ConcurrentCollectionStorage.Bus3);
             });

2. Второй подход

ThreadPool.QueueUserWorkItem(o =>
               { Save<Foo>ConcurrentCollectionStorage.Bus); });  
ThreadPool.QueueUserWorkItem(o =>
               { Save<Bar>(ConcurrentCollectionStorage.Bus2); });  
ThreadPool.QueueUserWorkItem(o =>
               { Save<Car>(ConcurrentCollectionStorage.Bus3); });  

3. Третий подход. Создание темы вручную и присоединение к ним.

При выполнении этих операций я не хочу, чтобы мое приложение зависало. Я хочу, чтобы он обрабатывал и сохранял данные, а также завершал, но не влиял на процессы переднего плана, все приложение.

Какой лучший способ сделать это?

Какой из них мне следует использовать? Есть ли лучший способ сделать это?

Ответы [ 3 ]

3 голосов
/ 22 сентября 2011

Поскольку каждая коллекция хранится в отдельном хранилище, я не хочу объединять их или сохранять в одном месте.

При выполнении этих операций я не хочу, чтобы мое приложение зависало. Я хочу, чтобы он обрабатывал и сохранял данные, а также завершал, но не влиял на основные процессы, все приложение.

Поставить в очередь три потока в пуле потоков.

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

В .NET 4.0 вы можете использовать параллельную библиотеку задач:

    Task.Factory.StartNew(() => { Save<Foo>(ConcurrentCollectionStorage.Bus1); });
    Task.Factory.StartNew(() => { Save<Bar>(ConcurrentCollectionStorage.Bus2); });
    Task.Factory.StartNew(() => { Save<Car>(ConcurrentCollectionStorage.Bus3); });

Однако из вашего вопроса не ясно, что является критическим узким местом. TPL не может помочь вам, если у вас узкое место, дисковый ввод-вывод или сетевая задержка.

Если вы хотите, чтобы ваш основной поток ожидал их завершения, вы можете сделать это (есть несколько способов сделать это):

    Task t1 = Task.Factory.StartNew(() => { Save<Foo>(ConcurrentCollectionStorage.Bus1); });
    Task t2 = Task.Factory.StartNew(() => { Save<Bar>(ConcurrentCollectionStorage.Bus2); });
    Task t3 = Task.Factory.StartNew(() => { Save<Car>(ConcurrentCollectionStorage.Bus3); });

    Task.WaitAll(t1,t2,t3);

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

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

если вы используете .net 4, вы должны использовать TASK вместо вызова API ThreadPool.Если ваша операция сохранения короткая, используйте ее как есть.если он длинный и именно поэтому вы рассматриваете ручную нить, вам следует использовать задачу, но пометить ее как «длительную»

HTH

...