Многопоточность / опрос базы данных в службе Windows
Это будет долгий вопрос из двух частей, так что спасибо за терпение и за любую помощь.
Я создаю службу Windows (.net 4), которая имеет несколько обязанностей:
- Таблица базы данных опроса, ища элементы для обработки
- Очереди товаров для обработки
- Обработка файлов на диске (опрашиваемая таблица базы данных описывает обрабатываемые файлы (путь к файлу, состояние обработки))
- Записать результаты обработки в базу данных
- Уведомлять людей о том, что происходит обработка событий (обработка завершена, ошибки обработки)
Предполагается, что время обработки каждого элемента занимает много времени (часы), поэтому обработка должна выполняться в его собственном потоке, и несколько элементов должны обрабатываться одновременно (хотя, вероятно, не все элементы в очереди, если в очереди много элементов)).
Я не эксперт по многопоточности, но, похоже, этот проект требует его для опроса базы данных и обработки файлов.
Я думаю, что я должен использовать Task Parallel Library, но не знаю, с чего начать кодирование этого приложения.
Как я должен идти о опросе базы данных?
Вот идея для класса опроса базы данных, который у меня был:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;
using System.Threading.Tasks;
public class DbPoller
{
Timer _timer;
public double Interval { get; private set; }
public DbPoller(double interval)
{
Interval = interval;
}
public void BeginPolling()
{
if (_timer != null)
{
_timer.Dispose();
}
_timer = new Timer(Interval);
_timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
_timer.Start();
}
public void EndPolling()
{
if (_timer != null)
{
_timer.Dispose();
}
}
public IEnumerable<BatchMetadata> Poll()
{
var pollTask = new Task<IEnumerable<BatchMetadata>>(() =>
{
// polling logic here
throw new NotImplementedException();
});
pollTask.Start();
return pollTask.Result;
}
void timer_Elapsed(object sender, ElapsedEventArgs e)
{
Poll();
}
}
Как мне управлять обработкой нескольких предметов?
Это область, в которой я еще больше не уверен. Как я уже говорил выше, я думаю, что обработка файлов должна происходить в собственном потоке. Кроме того, я думаю, что я должен обрабатывать некоторые элементы одновременно (хотя и не все в очереди, если их очень много). Я знаю, что у TPL есть класс очереди, ориентированный на многопотоковое исполнение, который может мне помочь. Я полагаю, что я отвечаю за управление количеством одновременно обрабатываемых элементов, или TPL также имеет функции, которые могут помочь с этим?
1 ответ
Возможно, SQL Server Reporting Services может предложить вам решение, которое не потребует от вас опроса базы данных, но позволит вам реагировать на изменения в базе данных.
Что касается обработки заданий, TPL может сделать это, но использование Windows Workflow также может быть вариантом.
Все зависит от того, какую обработку необходимо выполнить и сколько времени займет работа.