无法将自定义方法作为参数传递给ElapsedEventHandler()

时间:2019-05-23 19:44:22

标签: c# windows-services parameter-passing directoryinfo

我正在使用Windows服务,该服务将在特定文件夹中查找备份文件。当找到一个备份文件时,该服务将从该位置移走所有备份文件,并将它们移到已存档的文件夹中。

我以前使用过FileSystemWatcher,但是由于它在服务器上不起作用,所以我使用DirectoryInfo查找文件。

要求是每隔5分钟运行一次此服务,以查找进入的任何新备份文件。

我对计时器的实现感到困惑。

以下是我的代码:

我想从ElapsedEventHandler调用MoveToProcessed(processed)方法。但出现错误 CS0149-预期方法名称

protected override void OnStart(string[] args)
{
    DirectoryInfo dir = new DirectoryInfo(backupdirectory);

    // Other unrelated code omitted

    // Move all the Backup files to Processed folder at certain intervals.
    createOrderTimer = new System.Timers.Timer();

    //***** ERROR ON THE FOLLOWING LINE *****
    createOrderTimer.Elapsed += new ElapsedEventHandler(MoveToProcessed(processed));
    //***************************************

    createOrderTimer.Interval = 300000; // 15 min
    createOrderTimer.Enabled = true;
    createOrderTimer.AutoReset = true;
    createOrderTimer.Start();
}

private void MoveToProcessed(string processed)
{
    // Code here backs up and restores files
}

1 个答案:

答案 0 :(得分:0)

您可以轻松地从事件处理程序中调用方法,但是事件处理程序方法本身必须匹配特定的签名。对于System.Timers类,它应该看起来像这样:

private static void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)

因此,您可以简单地使用此签名创建一个方法,将其分配为事件处理程序,然后从那里调用您的方法:

// Elapsed event handler calls our other method
private static void CreateOrderTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    // Not sure what the string argument represents, or how it should be set
    MoveToProcessed("some string");
}

// We can assign the event handler above when creating the Timer:
protected override void OnStart(string[] args)
{
    var createOrderTimer = new System.Timers.Timer
    {
        Interval = TimeSpan.FromMinutes(15).TotalMilliseconds,
        AutoReset = true
    };

    createOrderTimer.Elapsed += CreateOrderTimer_Elapsed;
    createOrderTimer.Start();
}