c# - Windows 服务中的线程中的计时器

标签 c# vb.net multithreading windows-services timer

我不知道如何以最好的方式处理这个问题。

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

现在我需要重新编写 windows 服务才能在 1 个以上的 DSN 上运行。 我正在考虑在 Windows 服务中创建多个线程,然后在每个线程中再次有一个单独的计时器。 这是个好主意吗?如何实现?我想避免为每个 DSN 提供一个 Windows 服务。

如果我没有任何意义,我会尝试画出它

                             Windows Service

线程 1(DSN1)----------------------------线程 2(DSN2)------------ --------------线程3(DSN3)
定时器(每 X 分钟滴答一次)----------------定时器(相同)-------------------- ---定时器(相同)
Logic()--------------------------------------------逻辑- ------------------------------逻辑()

希望我的问题有意义:)

最佳答案

据我所知,每个计时器都代表一个独立的线程。知道这一点后,我会尝试为每个给定的 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();
    }
}

关于c# - Windows 服务中的线程中的计时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8396645/

相关文章:

c++ - 在构造函数中注册 weak_ptr 观察者

c# - 检测 Windows Mobile 与 "plain"Windows CE

c# - 从另一个线程获取控件的属性

c# - 在 C# 中,SerialPort 类的 DataReceived 事件处理程序是否在它自己的线程上执行?

VB.NET ListView 文本更改搜索

vb.net - 在 vb.net 中获取命令行参数的最佳方法是什么

c# - 我如何等待所有其他线程完成它们的任务?

java - java中如何获取uint32_t对应的唯一值?

c# - 迭代获取特定集合的所有子集

C# XNA 矩阵 - 找出矩阵乘法后的当前位置