首页 > 解决方案 > 如何使应用程序永远不会关闭并每小时执行一个程序?

问题描述

怎么样!,有人可以帮我解决这个问题,我正在寻找的是每次“00”分钟(即每小时)通过控制台应用程序,存储过程只执行一次(我不知道为什么它运行超过 1 次,因为它是一个插入过程)并且我还希望应用程序永远不会关闭,稍后我想创建一个服务并执行更多过程,但我需要这个一段时间。我在做什么错?,想法是在控制台中写“等待批量插入”,到时候执行程序并写“成功插入”,然后继续输入“等待批量插入”,直到下一小时到来。

using System;
using System.Data;
using System.Data.SqlClient;
using System.Threading;

namespace Job_StoreProcedure
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SqlConnection conn = new SqlConnection
                  ("Server=localhost\\SQLEXPRESS;Database=VIDEOJUEGOS;Integrated Security=SSPI"))
            {
                conn.Open();
                for (int i = 0; i - 1 < i++; i++)
                {
                    Console.WriteLine("Waiting for insertion in batch");
                    if (DateTime.Now.ToString("mm") == "00")
                    {
                        SqlCommand cmd = new SqlCommand("usp_virtualX", conn);
                        cmd.CommandType = CommandType.StoredProcedure;

                        using (SqlDataReader rdr = cmd.ExecuteReader())
                        {
                            while (rdr.Read())
                            {
                                Console.WriteLine("Successful insertion");
                            }
                        }
                    }
                }
            }
        }
    }
}

标签: c#for-loopstored-procedureswhile-loopconsole-application

解决方案


只需使用计时器。

using System.Timers;
//...
class Program
{
    private static Timer MainTimer = new Timer(1000 * 60 * 60);

    static void Main(string[] args)
    {
        Console.WriteLine("Waiting for insertion in batch");

        MainTimer.Elapsed += MainTimer_Elapsed;

        // Wait for the start of the hour. Then start the one-hour MainTimer. 
        var tmptimer = new Timer() { Interval = 1000 };
        tmptimer.Elapsed += (sender, e) =>
        {
            if (DateTime.Now.Minute == 0)
            {
                MainTimer.Start();              
                tmptimer.Stop();
                MainTimer_Elapsed(null, null);  // Call manually first time 
            }
        };
        tmptimer.Start();

        while (true)
            Console.Read();
    }

    private static void MainTimer_Elapsed(object sender, ElapsedEventArgs e)
    {
        using (SqlConnection conn = new SqlConnection ("Server=localhost\\SQLEXPRESS;Database=VIDEOJUEGOS;Integrated Security=SSPI"))
        {
            conn.Open();
            SqlCommand cmd = new SqlCommand("usp_virtualX", conn);
            cmd.CommandType = CommandType.StoredProcedure;

            using (SqlDataReader rdr = cmd.ExecuteReader())
            {
                while (rdr.Read())
                {
                    Console.WriteLine("Successful insertion");
                }
            }
        }
        Console.WriteLine("Waiting for insertion in batch");

        GC.Collect();
    }
}

推荐阅读