这将是一个长期的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是否也有帮助解决这些问题的功能?
答案 0 :(得分:0)
也许SQL Server Reporting Services可能为您提供一个解决方案,它不需要您轮询数据库,但允许您响应数据库中的更改。
对于处理作业,TPL可以做到这一点,但使用Windows Workflow也可能是一种选择。
这完全取决于需要完成哪种处理以及工作需要多长时间。