【发布时间】: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