每分钟在控制台应用程序中执行代码

时间:2014-09-05 21:48:10

标签: c# console-application

我在C#中有一个简单的应用程序,它从一个位置获取PDF并将其移动到另一个位置。

namespace MoveFiles
{
class Program
{
    public static string destinationPath = @"S:\Re\C";
    static void Main(string[] args)
    {

        //location of PDF files

        string path = @"S:\Can\Save";

        //get ONLY PDFs

        string[] filePath = Directory.GetFiles(path, "*.pdf");


        foreach (string file in filePath)
        {
            Console.WriteLine(file);
            string dest = destinationPath + "\\" + Path.GetFileName(file);
            File.Move(file, dest);
        }
        Console.ReadKey();


    }
}

}

如果我运行这个应用程序它可以完成工作,但是,我需要每分钟执行一次这个代码。我可以使用task scheduler每分钟运行应用程序,但遗憾的是最小运行时间为5分钟。

我尝试使用while(true),但它不起作用。如果我在应用程序运行时向文件夹添加更多PDF文件,则不会将其移动到其他文件夹。

我在网上发现了使用Timer的建议,但我遇到了问题:

static void Main(string[] args)   
{
    Timer t = new Timer(60000); // 1 sec = 1000, 60 sec = 60000
    t.AutoReset = true;
    t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
    t.Start();
  }
  private static void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
  {
     // do stuff every minute
   }

但是我遇到了编译器错误:

  

错误2参数1:无法从'int'转换为'System.Threading.TimerCallback'C:\ Win \ MoveFiles \ MoveFiles \ MoveFiles \ Program.cs 22 33 MoveFiles

有关如何解决此问题的任何建议?

3 个答案:

答案 0 :(得分:0)

在这里查看构造函数:http://msdn.microsoft.com/en-us/library/system.threading.timer(v=vs.110).aspx

这是此构造函数的方法签名之一:

Timer(TimerCallback, Object, Int32, Int32)

您只能使用间隔来实例化System.Threading.Timer。要么改为使用System.Timers.Timer(http://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx),要么提供TimerCallback,Object状态(可以为null),到期时间和句点。请参阅此处:&{34;参数。"

下的http://msdn.microsoft.com/en-us/library/2x96zfy7(v=vs.110).aspx

答案 1 :(得分:0)

private static Timer timer;

static void Main(string[] args)
{
    timer = new Timer(timer_Elapsed);
    timer.Change(60000, 60000);
    Console.ReadKey();
}

private static void timer_Elapsed(object o)
{
    // do stuff every minute
}

答案 2 :(得分:0)

解决方案比我想象的要容易。

这是我如何解决它。它可能不是最好的解决方案,但它可以满足我的需要。

我创建了一个while循环并使用Thread.Sleep(60000)强制该应用在再次执行之前进入休眠状态。

namespace MoveFiles
{
class Program
{
    public static string destinationPath = @"S:\Re\C";
    static void Main(string[] args)
    {

        //location of PDF files

        while (true)
        {
            string path = @"S:\Can\Save";

            //get ONLY PDFs

            string[] filePath = Directory.GetFiles(path, "*.pdf");


            foreach (string file in filePath)
            {
                Console.WriteLine(file);
                string dest = destinationPath + "\\" + Path.GetFileName(file);
                File.Move(file, dest);
            }
            Thread.Sleep(60000);
        }

    }

}
}