Windows服务中的多线程/数据库轮询

时间:2011-08-04 14:10:53

标签: .net multithreading windows-services polling task-parallel-library

这将是一个长期的2部分问题,所以感谢对我的支持和任何帮助。

我正在创建一个有几个职责的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 :(得分:0)

也许SQL Server Reporting Services可能为您提供一个解决方案,它不需要您轮询数据库,但允许您响应数据库中的更改。

对于处理作业,TPL可以做到这一点,但使用Windows Workflow也可能是一种选择。

这完全取决于需要完成哪种处理以及工作需要多长时间。