【问题标题】:Multithreading/Database Polling in Windows ServiceWindows 服务中的多线程/数据库轮询
【发布时间】:2011-08-04 14:10:52
【问题描述】:

这将是一个很长的两部分问题,因此感谢您对我的包容和任何帮助。

我正在创建一个具有一些职责的 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 是否也有功能可以帮助解决这个问题?

【问题讨论】:

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


    【解决方案1】:

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

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

    这完全取决于需要完成什么样的处理以及工作需要多长时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      相关资源
      最近更新 更多