Windows Service Best Loop Way?

时间:2016-05-03 07:39:49

标签: sql-server windows loops service

我需要一个Windows服务,每10分钟将数据传输到另一台SQL服务器。 此服务的安排周期为10分钟,并执行5个传输数据的存储过程

如果机器重新启动,服务应该再次运行。

那么,这项服务的最佳方式是什么?

我的解决方案如下。但是这项服务将在第一次停止后停止:

static class Program
{
    static void Main()
    {

#if DEBUG

        Service1 myService = new Service1();
        myService.OnDebug();

#else

        var servicesToRun = new ServiceBase[]
        {
            new Service1()
        };
        ServiceBase.Run(servicesToRun);

#endif

    }


public partial class Service1 : ServiceBase
{
    Thread _worker;
    static readonly AutoResetEvent StopRequest = new AutoResetEvent(false);
    private static IDataRepository _dataRepository;

    public Service1()
    {
        _dataRepository = new DataRepository();
        InitializeComponent();
    }

    public void OnDebug()
    {
        OnStart(null);
    }
    protected override void OnStart(string[] args)
    {
        _worker = new Thread(DoWork);
        _worker.Start();
    }

    protected override void OnStop()
    {
        StopRequest.Set();
        _worker.Join();
    }

    private static void DoWork()
    {
        for (;;)
        {
            if (!_dataRepository.CheckInternetConnection()) return;
            if (!_dataRepository.CheckDatabaseConnection()) return;
            if (!_dataRepository.CheckOppositeDatabaseConnection()) return;
            if (StopRequest.WaitOne(10000)) return;
            List<Test> comeResults = _dataRepository.CheckNewDataCashRegister();
            if (comeResults == null) return;
            bool sendTest = _dataRepository.SendTest(comeResults);
            if (!sendTest) return;
        }

    }
}

1 个答案:

答案 0 :(得分:0)

如果您想最小化外部依赖关系,例如使用任务计划程序,您可以安排服务中的工作,如下所示:

public partial class Service1 : ServiceBase
{
    private readonly CancellationTokenSource _cancellationTokenSource;
    private static IDataRepository _dataRepository;

    public Service1()
    {
        _dataRepository = new DataRepository();
        _cancellationTokenSource = new CancellationTokenSource();
        InitializeComponent();
    }

    public void OnDebug()
    {
        OnStart(null);
    }

    protected override void OnStart(string[] args)
    {
        ScheduleWorkAsync();
    }

    protected override void OnStop()
    {
         _cancellationTokenSource.Cancel();
         _cancellationTokenSource.Dispose();
    }

    private async Task ScheduleWorkAsync()
    {
        var _cancellationToken = _cancellationTokenSource.Token;

        while (!_cancellationTokenSource.IsCancellationRequested)
        {
            try
            {
                DoWork();
                await Task.Delay(TimeSpan.FromMinutes(10), _cancellationToken);
            }
            catch (OperationCanceledException)
            {
            }
        }
    }

    private void DoWork()
    {
        if (!_dataRepository.CheckInternetConnection()) return;
        if (!_dataRepository.CheckDatabaseConnection()) return;
        if (!_dataRepository.CheckOppositeDatabaseConnection()) return;

        List<Test> comeResults = _dataRepository.CheckNewDataCashRegister();
        if (comeResults == null) return;
        bool sendTest = _dataRepository.SendTest(comeResults);
        if (!sendTest) return;
    }       
}