這將是一個很長的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是否具有幫助解決這個問題的功能?