排队报告的更好方法

时间:2011-12-20 13:13:11

标签: c# asp.net windows-services

假设我有一个运行生成报告的方法的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!)或其他更好的方法来执行此操作?

2 个答案:

答案 0 :(得分:1)

如何使用Microsoft Message Queuing (MSMQ)? MSMQ在操作系统级别创建和管理消息队列。它似乎是您的应用程序的完美匹配。

答案 1 :(得分:1)

SQL触发器或消息队列

http://msdn.microsoft.com/en-us/library/ms189799.aspx

因此,当记录插入到表中时,您可以触发一个操作,例如调用一个sproc。

就个人而言,我喜欢你的第一次投票方法。