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

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

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

1 Ответ

0 голосов
/ 04 августа 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...