2011-12-20 78 views
1

假設我有一個運行方法來生成報告的Windows服務。更好的方法來排隊報告

例如說我有了,報告路徑,狀態報告的名稱的報告表中的參數等

當用戶點擊生成報告按鈕,一個新的條目將被添加到表格中帶排隊狀態。該服務將採用排隊報告,生成報告,更新狀態並設置完成報告的路徑。

2種方式我能想到這樣做的是要麼輪詢排隊報告表(類似):

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!)或另一種更好的方式來做到這一點?

+1

你考慮過sql server通知服務嗎? http://www.codeproject.com/KB/dotnet/sqlns.aspx – Pleun 2011-12-20 13:24:02

+0

@Pleun沒有被CEP取代(我對此一無所知!)?該codeproject頁面是從2002年http://blogs.msdn.com/b/hovsep/archive/2009/08/23/notification-services-has-died-welcome-sql-server-2008-r2-complex-event- processing-cep-technology.aspx – woggles 2011-12-20 18:09:52

回答

1

SQL觸發器或消息隊列

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

所以當一個記錄插入就可以把火關的動作如調用一個存儲過程的表。

我個人喜歡你的第一輪投票方式。

+0

觸發器的問題是我需要它來運行.NET代碼,而不僅僅是一個存儲過程 - 是否有可能這樣做?我可能最終會使用輪詢方法,但我唯一關心的是用戶的延遲(即等待20秒才能看到他們的報告正在生成)。我可以增加輪詢時間,但需要每x秒測試一次數據庫的效果。 – woggles 2011-12-20 18:17:09