Многопоточность / опрос базы данных в службе Windows

Это будет длинный вопрос, состоящий из двух частей, поэтому спасибо за терпение и за любую помощь.

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


person Ronnie Overby    schedule 04.08.2011    source источник


Ответы (1)


Возможно, у служб SQL Server Reporting Services есть решение, которое не потребует от вас опроса базы данных, но позволит вам реагировать на изменения в базе данных.

Что касается обработки заданий, TPL может это делать, но также может быть вариант с использованием Windows Workflow.

Все зависит от того, какую обработку нужно выполнить и сколько времени займет работа.

person Emond Erno    schedule 04.08.2011