2015-06-25 4 views
3

Мое приложение делает много фоновых задач, и для каждого такого действия, я создал новый поток для каждого действиядействия в одном потоке

Thread StreamResponse = new Thread(() => 
    { 
     DB.ToDb(flag); 
    }); 
StreamResponse.Start(); 

Эти действия происходят тысячи в минуту. Заметил, что приложение начинает есть RAM. Это нормально, потому что приложение создает тысячи потоков и не закрывает их.

Отсюда возникает вопрос, как это сделать, чтобы эти действия были в отдельном потоке. Например, я создаю поток в отдельном классе и в этом потоке действует commit.

Или иначе? Задача, созданная потоком, и после завершения действия автоматически закрывается. Но, возможно, более правильно все эти шаги нужно сделать в другом потоке. Как вы думаете? Как сделать?

Возможно использование Dispatcher.BeginInvoke?

+3

грузоотправитель только для UI потоке, то есть материал, который происходит на элементы пользовательского интерфейса кнопки, как. Пожалуйста, прочитайте о TPL, и вы можете использовать wait, asnyc и Task.run() – Gilad

+0

Вы имеете в виду, 'var worker = new Worker(); Thread t = new Thread (() => worker.DoWork(); t.IsBackground = true; t.Start(); '? –

+0

Я бы посмотрел на использование пула потоков, а не на создание« тысяч потоков ». (TPL и async/await). –

ответ

3

Кажется, вы могли бы воспользоваться использованием ThreadPool Class. От MSDN:

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

Вот пример кода для его использования:

ThreadPool.QueueUserWorkItem((x) => 
{ 
    DB.ToDb(flag); 
}); 

И вы можете установить максимальное количество одновременных потоков в пуле потоков с использованием ThreadPool.SetMaxThreads Method для того, чтобы улучшить производительность и использование ограничения памяти в ваше приложение.

+2

Не помогает, потому что, по-видимому, он производит тысячи * параллельных * потоков/задач. Они будут сильно дросселированы бассейном, и бассейн будет перегружен в то же время, что приведет к остальной части приложения. – usr

+0

@usr спасибо за комментарий – alexander

+0

@usr: Действительно, пул потоков имеет ограниченный «параллелизм» и лучше всего подходит для обработки большого количества коротких задач, поскольку он уменьшает накладные расходы на создание и уничтожение отдельных потоков. Я думаю, что * alexander * выиграет от использования пула потоков, если его задачи не потребуют выполнения «независимых» потоков. –

0

Почему бы не использовать фабрику задач?

var task = Task.Factory.StartNew(()=>{ /*do stuff*/ }); 

Задача завод работает точно так же, как очередь делает, но имеет то преимущество, что позволяет обрабатывать любую выводимую информацию более элегантно

var result = await task; 

Завод будет только порождать темы, когда это имеет смысл, так essentailly такой же, как пул потоков

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

Если вам нужна дополнительная информация о есть хороший ответ можно найти здесь: ThreadPool.QueueUserWorkItem vs Task.Factory.StartNew

+0

Задание фабрике придется ждать, пока предыдущее не выполнит следующее: Проблема в том, что действие делает вклад информации в разные таблицы базы данных. Соответственно, действие может быть сделано медленно. Нет? – alexander

+0

@alexander, если вам нужна информация, которую вы можете ожидать, в противном случае, пожар и забудьте, обновите ответ, чтобы дать ссылку, как обрабатывать более длительные запущенные задачи – konkked

Смежные вопросы