Это будет длинный, состоящий из двух частей вопрос, так что спасибо за поддержку и за любую помощь.
Я создаю службу 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 есть функции, которые также могут помочь с этим?