Это будет длинный вопрос, состоящий из двух частей, поэтому спасибо за терпение и за любую помощь.
Я создаю службу Windows (.net 4), у которой есть несколько обязанностей:
- Таблица базы данных опроса, поиск элементов для обработки
- Создание очереди для обработки
- Обработка файлов на диске (опрашиваемая таблица базы данных описывает обрабатываемые файлы (путь к файлу, статус обработки))
- Записывать результаты обработки в базу данных
- Уведомлять людей о событиях обработки (обработка завершена, ошибки обработки)
Предполагается, что время обработки для каждого элемента занимает много времени (часы), поэтому обработка должна происходить в отдельном потоке, а несколько элементов должны обрабатываться одновременно (хотя, вероятно, не все элементы в очереди, если в очереди много элементов. ).
Я не эксперт в многопоточности, но похоже, что этот проект требует этого для опроса базы данных и обработки файлов.
Я думаю, что мне следует использовать параллельную библиотеку задач, но я действительно не знаю, с чего начать кодирование этого приложения.
Как мне провести опрос базы данных?
Вот идея класса опроса базы данных, который у меня был:
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 есть функции, которые могут помочь в этом?