0

我希望我的函数每 2 秒执行一次,以检查是否有任何新用户,以便我可以为他们创建一个新日志。这是在控制台应用程序中,所以我使用了 Thread。但是我的控制台在运行一次该功能后关闭。只要我运行控制台,我就希望计时器运行,并且我的 createLog 函数将每 2 秒执行一次。我对 C# 比较陌生,所以也许我的计时器概念是完全错误的。请帮忙...

namespace ConsoleApplication1
{
    class Program
    {
        public static Hashtable clientsList = new Hashtable();


        static void Main(string[] args)
        {
            Timer t = new Timer(createLog, null, 0, 2000);


            IPAddress ip = IPAddress.Parse("127.0.0.1");
            TcpListener serverSocket = new TcpListener(ip, 9888);
            TcpClient clientSocket = default(TcpClient);
            int counter = 0;

            serverSocket.Start();
            .... //this main is monitoring the network....
           console.read();
        }



 private static void createLog(object state)
        {
         //this function checks the database and if there is new user it will create a new text file for he/she. 

        }
  }
4

4 回答 4

0

您需要像Console.ReadLine在调用之后那样进行阻塞调用Start以保持前台线程运行。此外,您的 Timer 有资格进行垃圾收集,因为它在创建后不再被引用。在 Main 方法的末尾使用GC.KeepAlive以防止计时器被 GC'd。

于 2012-05-11T04:35:15.363 回答
0

Winforms/Console 应用程序 -> 比较 .NET Framework 类库中的计时器类

WPF ->使用 Dispatcher 构建更具响应性的应用程序

于 2012-05-11T04:30:38.953 回答
0

由于这是一个控制台应用程序,您需要添加一些东西Console.ReadLine()来保持应用程序处于活动状态,直到用户想要关闭它。

于 2012-05-11T04:29:37.513 回答
0

也许FluentScheduler可以提供帮助。

using FluentScheduler;

public class MyRegistry : Registry
{
    public MyRegistry()
    {
        // Schedule an ITask to run at an interval
        Schedule<MyTask>().ToRunNow().AndEvery(2).Seconds();

        // Schedule a simple task to run at a specific time
        Schedule(() => Console.WriteLine("Timed Task - Will run every day at 9:15pm: " + DateTime.Now)).ToRunEvery(1).Days().At(21, 15);

        // Schedule a more complex action to run immediately and on an monthly interval
        Schedule(() =>
        {
            Console.WriteLine("Complex Action Task Starts: " + DateTime.Now);
            Thread.Sleep(1000);
            Console.WriteLine("Complex Action Task Ends: " + DateTime.Now);
        }).ToRunNow().AndEvery(1).Months().OnTheFirst(DayOfWeek.Monday).At(3, 0);
    }
}
于 2012-05-11T04:30:14.137 回答