假设我有一个运行生成报告的方法的Windows服务。
例如说我有一个报告表,其中包含报告路径,状态,报告名称,参数等。
当用户单击生成报告按钮时,新条目将添加到状态为排队的表中。该服务将采用排队报告,生成报告,更新状态并设置已完成报告的路径。
我能想到的两种方法是轮询表格中的排队报告(类似):
TimerCallback callback = new TimerCallback(RunQuery);
this.QueryTimer = new Timer(callback, null, 1000, 10000);
public void RunQuery(object obj)
{
//find reports with status of queued,
//loop through them and generate reports
}
或者使用ReportId创建一个文件并使用FileSystemWatcher来确定要运行的报告(类似):
private void FileSystemWatcher1_Created(object sender, System.IO.FileSystemEventArgs e)
{
ReportStack.Push(e.FullPath);
Thread TR = new Thread(RunQuery);
TR.Start();
}
public void RunQuery()
{
string filePath = Convert.ToString(ReportStack.Pop());
GenerateReport(filePath);
...
}
第一种方法的缺点是我需要指定一个轮询时间,并且报告在排队时不会立即生成。第二种方法的缺点是创建和删除文件的小麻烦,设置应用程序写入共享文件夹的权限等。
有没有办法让服务自动启动报告,因为它们被放入报告表(类似于DatabaseTableWatcher!)或其他更好的方法来执行此操作?
答案 0 :(得分:1)
如何使用Microsoft Message Queuing (MSMQ)? MSMQ在操作系统级别创建和管理消息队列。它似乎是您的应用程序的完美匹配。
答案 1 :(得分:1)
SQL触发器或消息队列
http://msdn.microsoft.com/en-us/library/ms189799.aspx
因此,当记录插入到表中时,您可以触发一个操作,例如调用一个sproc。
就个人而言,我喜欢你的第一次投票方法。