Windows服务中线程内的计时器

Tho*_*mas 4 c# vb.net multithreading windows-services timer

我无法弄清楚如何以最好的方式解决这个问题.

现在我有一个Windows服务,其唯一任务是从具有特定DSN的数据库中收集数据,然后在数据有效时发送电子邮件.该服务包含一个计时器,每5分钟计时一次,并执行上述任务.

现在我需要重新编写Windows服务才能在1个以上的DSN上运行.我想在windows服务中创建几个线程,然后在每个线程内再次有一个seperat计时器.这是一个好主意,如何做到这一点?我想避免为每个DSN提供Windows服务.

如果我没有任何意义,我会尝试绘制它

                             Windows Service
Run Code Online (Sandbox Code Playgroud)

线程1(DSN1)-----------------------------线程2(DSN2)------------- --------- Thread3(DSN3)
定时器(每X分钟勾选一次)-----------------定时器(相同)--------- ----------------定时器(相同)
逻辑()--------------------------- - - - - - - - - - 逻辑 - - - - - - - - - - - - - - - - - 逻辑()

希望我的问题有道理:)

Pil*_*anz 6

据我所知,每个计时器代表一个自己的线程.知道了这一点,我会尝试为每个给定的dsn动态创建计时器对象.

public partial class Service1 : ServiceBase
{
    public Service1()
    {
        InitializeComponent();
    }

    private List<GetDataFromDSN> list = null;
    protected override void OnStart(string[] args)
    {
        list = new List<GetDataFromDSN>();
        // assume args contains your given dsn values
        foreach (string dsn in args)
        {
            GetDataFromDSN newObj = new GetDataFromDSN();
            newObj.DSN = dsn;
            list.Add(newObj);
            newObj.Start();
        }
    }
}

public class GetDataFromDSN
{
    public string DSN { get; set; }
    private Timer timer = null;
    private double interval = 1000*60*5; // 5 minutes interval
    public GetDataFromDSN()
    {
        // init your object
        timer = new Timer(interval);
        timer.Elapsed +=new ElapsedEventHandler(timer_Elapsed);
    }
    private void timer_Elapsed(object sender, ElapsedEventArgs e)
    {
        // do what ever you want
    }
    public void Start() // or even make timer public
    {
        timer.Start();
    }
    public void Stop()
    {
        timer.Stop();
    }
}
Run Code Online (Sandbox Code Playgroud)