关于网站定时执行任务计划以及多线程

时间:2023-02-25 18:46:24
怎么用控制台应用程序做一个定时执行多个不同的任务,每隔一定时间就会执行一次

14 个解决方案

#1


控制台程序不是可以传递参数吗,判断参数啊
然后任务计划里不同时间启动传递进不同的参数即可

#2


引用 1 楼 Z65443344 的回复:
控制台程序不是可以传递参数吗,判断参数啊
然后任务计划里不同时间启动传递进不同的参数即可

主要是我没有搞个任务计划,不知道怎么做,而且这个只是在服务器中运行,更新数据库中的数据就可以了,不用传参数

#3


如果你用的是sql server 的话,有个简单的方法,用数据库中的WAITFOR 命令做定时任务

#4


引用 2 楼 u013331731 的回复:
Quote: 引用 1 楼 Z65443344 的回复:

控制台程序不是可以传递参数吗,判断参数啊
然后任务计划里不同时间启动传递进不同的参数即可

主要是我没有搞个任务计划,不知道怎么做,而且这个只是在服务器中运行,更新数据库中的数据就可以了,不用传参数


http://188.93.174.57/#newwindow=1&q=windows%E4%BB%BB%E5%8A%A1%E8%AE%A1%E5%88%92%E8%AE%BE%E7%BD%AE

#5


Thread.Sleep

#6


假如你有20个任务,你还不能写“一个”控制台程序(因为你设计不了),你应该创建20个程序,有公用的部分引用一个公用的工程(编译为DLL)即可。 

#7


用windows service

#8


引用 6 楼 sp1234 的回复:
假如你有20个任务,你还不能写“一个”控制台程序(因为你设计不了),你应该创建20个程序,有公用的部分引用一个公用的工程(编译为DLL)即可。 
就三个任务,两个检查数据,一个更新数据,要求是用控制台应用程序,不知道怎么用控制台应用程序写计划任务,菜鸟没有接触过

#9


引用 5 楼 wansai00 的回复:
Thread.Sleep
有没有简单点的实例,没有接触过任务计划,菜鸟不会

#10


任务计划是系统功能
不明白百度一下

你只要做好你的逻辑处理就行了
系统到时间会自动执行你的控制台程序
执行完自动退出就好

如果你有办法把3个功能做到一个控制台程序里去,通过启动控制台程序时传入不同参数执行不同功能
那么只要在添加任务计划的时候指定参数就可以了
如果实在弄不明白,干脆做成3个程序,不同时间调用不同程序好了

#11


该回复于2014-11-05 10:10:25被管理员删除

#12


建议做成一个windows  service,使用timer计时器来实现定时执行的功能

#13


class Program
    {
        public delegate int MyFunDel();
        static void Main(string[] args)
        {
            ThreadPool.QueueUserWorkItem((e) => {
                DateTime time;
                while (true)
                {
                    time = DateTime.Now.ToLocalTime();
                    if (time.ToLongTimeString().Equals("16:08:00"))
                    {
                        new MyFunDel(MyFun).BeginInvoke(new AsyncCallback(MyAsyncCallback), null);
                        Thread.Sleep(500);
                    }
                    if (time.Second == 0)
                    {
                        Console.WriteLine("{0} {1}", time.ToShortDateString(), time.ToShortTimeString());
                        Thread.Sleep(500);
                    }
                    Thread.Sleep(500);
                }
            });
            
            Console.ReadKey();
        }
        static int MyFun()
        {
            Console.WriteLine("服务器开始执行数据库操作.. 线程:{0}", Thread.CurrentThread.ManagedThreadId);
            DateTime time = DateTime.Now;
            Thread.Sleep(5000); //操作数据库
            return (DateTime.Now - time).Seconds;    //返回执行持续时间
        }
        //异步委托回调函数
        static void MyAsyncCallback(IAsyncResult result)
        {
            AsyncResult aResult = (AsyncResult)result; //封装类 通过接口 实现多态 
            MyFunDel addDel = (MyFunDel)aResult.AsyncDelegate; //封装委托
            int num = addDel.EndInvoke(result);  //获取异步操作结果
            string str = string.Format("{0} 操作数据库持续时间:{1}秒  线程:{2}",DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString(), num, Thread.CurrentThread.ManagedThreadId);
            Console.WriteLine(str);
            File.AppendAllText(@"c:/log.txt", str);
        }
    }

用控制台程序实现需要涉及很多因素,比如判断是否被异常终止,是否已完成操作等等。

#14


引用 13 楼 h_gxi 的回复:
class Program
    {
        public delegate int MyFunDel();
        static void Main(string[] args)
        {
            ThreadPool.QueueUserWorkItem((e) => {
                DateTime time;
                while (true)
                {
                    time = DateTime.Now.ToLocalTime();
                    if (time.ToLongTimeString().Equals("16:08:00"))
                    {
                        new MyFunDel(MyFun).BeginInvoke(new AsyncCallback(MyAsyncCallback), null);
                        Thread.Sleep(500);
                    }
                    if (time.Second == 0)
                    {
                        Console.WriteLine("{0} {1}", time.ToShortDateString(), time.ToShortTimeString());
                        Thread.Sleep(500);
                    }
                    Thread.Sleep(500);
                }
            });
            
            Console.ReadKey();
        }
        static int MyFun()
        {
            Console.WriteLine("服务器开始执行数据库操作.. 线程:{0}", Thread.CurrentThread.ManagedThreadId);
            DateTime time = DateTime.Now;
            Thread.Sleep(5000); //操作数据库
            return (DateTime.Now - time).Seconds;    //返回执行持续时间
        }
        //异步委托回调函数
        static void MyAsyncCallback(IAsyncResult result)
        {
            AsyncResult aResult = (AsyncResult)result; //封装类 通过接口 实现多态 
            MyFunDel addDel = (MyFunDel)aResult.AsyncDelegate; //封装委托
            int num = addDel.EndInvoke(result);  //获取异步操作结果
            string str = string.Format("{0} 操作数据库持续时间:{1}秒  线程:{2}",DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString(), num, Thread.CurrentThread.ManagedThreadId);
            Console.WriteLine(str);
            File.AppendAllText(@"c:/log.txt", str);
        }
    }

用控制台程序实现需要涉及很多因素,比如判断是否被异常终止,是否已完成操作等等。
我本来用timer做的,后台非要要求只用线程,就是要开启三个线程,其中两个线程每小时检查一次数据库(做的不同的事),另一个线程是每天早上检查一次

#1


控制台程序不是可以传递参数吗,判断参数啊
然后任务计划里不同时间启动传递进不同的参数即可

#2


引用 1 楼 Z65443344 的回复:
控制台程序不是可以传递参数吗,判断参数啊
然后任务计划里不同时间启动传递进不同的参数即可

主要是我没有搞个任务计划,不知道怎么做,而且这个只是在服务器中运行,更新数据库中的数据就可以了,不用传参数

#3


如果你用的是sql server 的话,有个简单的方法,用数据库中的WAITFOR 命令做定时任务

#4


引用 2 楼 u013331731 的回复:
Quote: 引用 1 楼 Z65443344 的回复:

控制台程序不是可以传递参数吗,判断参数啊
然后任务计划里不同时间启动传递进不同的参数即可

主要是我没有搞个任务计划,不知道怎么做,而且这个只是在服务器中运行,更新数据库中的数据就可以了,不用传参数


http://188.93.174.57/#newwindow=1&q=windows%E4%BB%BB%E5%8A%A1%E8%AE%A1%E5%88%92%E8%AE%BE%E7%BD%AE

#5


Thread.Sleep

#6


假如你有20个任务,你还不能写“一个”控制台程序(因为你设计不了),你应该创建20个程序,有公用的部分引用一个公用的工程(编译为DLL)即可。 

#7


用windows service

#8


引用 6 楼 sp1234 的回复:
假如你有20个任务,你还不能写“一个”控制台程序(因为你设计不了),你应该创建20个程序,有公用的部分引用一个公用的工程(编译为DLL)即可。 
就三个任务,两个检查数据,一个更新数据,要求是用控制台应用程序,不知道怎么用控制台应用程序写计划任务,菜鸟没有接触过

#9


引用 5 楼 wansai00 的回复:
Thread.Sleep
有没有简单点的实例,没有接触过任务计划,菜鸟不会

#10


任务计划是系统功能
不明白百度一下

你只要做好你的逻辑处理就行了
系统到时间会自动执行你的控制台程序
执行完自动退出就好

如果你有办法把3个功能做到一个控制台程序里去,通过启动控制台程序时传入不同参数执行不同功能
那么只要在添加任务计划的时候指定参数就可以了
如果实在弄不明白,干脆做成3个程序,不同时间调用不同程序好了

#11


该回复于2014-11-05 10:10:25被管理员删除

#12


建议做成一个windows  service,使用timer计时器来实现定时执行的功能

#13


class Program
    {
        public delegate int MyFunDel();
        static void Main(string[] args)
        {
            ThreadPool.QueueUserWorkItem((e) => {
                DateTime time;
                while (true)
                {
                    time = DateTime.Now.ToLocalTime();
                    if (time.ToLongTimeString().Equals("16:08:00"))
                    {
                        new MyFunDel(MyFun).BeginInvoke(new AsyncCallback(MyAsyncCallback), null);
                        Thread.Sleep(500);
                    }
                    if (time.Second == 0)
                    {
                        Console.WriteLine("{0} {1}", time.ToShortDateString(), time.ToShortTimeString());
                        Thread.Sleep(500);
                    }
                    Thread.Sleep(500);
                }
            });
            
            Console.ReadKey();
        }
        static int MyFun()
        {
            Console.WriteLine("服务器开始执行数据库操作.. 线程:{0}", Thread.CurrentThread.ManagedThreadId);
            DateTime time = DateTime.Now;
            Thread.Sleep(5000); //操作数据库
            return (DateTime.Now - time).Seconds;    //返回执行持续时间
        }
        //异步委托回调函数
        static void MyAsyncCallback(IAsyncResult result)
        {
            AsyncResult aResult = (AsyncResult)result; //封装类 通过接口 实现多态 
            MyFunDel addDel = (MyFunDel)aResult.AsyncDelegate; //封装委托
            int num = addDel.EndInvoke(result);  //获取异步操作结果
            string str = string.Format("{0} 操作数据库持续时间:{1}秒  线程:{2}",DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString(), num, Thread.CurrentThread.ManagedThreadId);
            Console.WriteLine(str);
            File.AppendAllText(@"c:/log.txt", str);
        }
    }

用控制台程序实现需要涉及很多因素,比如判断是否被异常终止,是否已完成操作等等。

#14


引用 13 楼 h_gxi 的回复:
class Program
    {
        public delegate int MyFunDel();
        static void Main(string[] args)
        {
            ThreadPool.QueueUserWorkItem((e) => {
                DateTime time;
                while (true)
                {
                    time = DateTime.Now.ToLocalTime();
                    if (time.ToLongTimeString().Equals("16:08:00"))
                    {
                        new MyFunDel(MyFun).BeginInvoke(new AsyncCallback(MyAsyncCallback), null);
                        Thread.Sleep(500);
                    }
                    if (time.Second == 0)
                    {
                        Console.WriteLine("{0} {1}", time.ToShortDateString(), time.ToShortTimeString());
                        Thread.Sleep(500);
                    }
                    Thread.Sleep(500);
                }
            });
            
            Console.ReadKey();
        }
        static int MyFun()
        {
            Console.WriteLine("服务器开始执行数据库操作.. 线程:{0}", Thread.CurrentThread.ManagedThreadId);
            DateTime time = DateTime.Now;
            Thread.Sleep(5000); //操作数据库
            return (DateTime.Now - time).Seconds;    //返回执行持续时间
        }
        //异步委托回调函数
        static void MyAsyncCallback(IAsyncResult result)
        {
            AsyncResult aResult = (AsyncResult)result; //封装类 通过接口 实现多态 
            MyFunDel addDel = (MyFunDel)aResult.AsyncDelegate; //封装委托
            int num = addDel.EndInvoke(result);  //获取异步操作结果
            string str = string.Format("{0} 操作数据库持续时间:{1}秒  线程:{2}",DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToLongTimeString(), num, Thread.CurrentThread.ManagedThreadId);
            Console.WriteLine(str);
            File.AppendAllText(@"c:/log.txt", str);
        }
    }

用控制台程序实现需要涉及很多因素,比如判断是否被异常终止,是否已完成操作等等。
我本来用timer做的,后台非要要求只用线程,就是要开启三个线程,其中两个线程每小时检查一次数据库(做的不同的事),另一个线程是每天早上检查一次