1

這將是一個很長的2部分問題,所以感謝您對我的支持和任何幫助。Windows服務中的多線程/數據庫輪詢

我創建一個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

也許SQL Server Reporting Services可能有一個解決方案,它不會要求您輪詢數據庫,但會允許您響應數據庫中的更改。

至於處理工作,TPL可以做到這一點,但使用Windows工作流也可能是一個選項。

這一切都取決於需要做什麼樣的處理和工作需要多長時間。