Невозможно передать пользовательский метод в ElapsedEventHandler () в качестве аргумента - PullRequest
0 голосов
/ 23 мая 2019

Я работаю над службой Windows, которая будет искать файлы резервных копий в определенной папке. Когда он найдет один, служба переместит все файлы резервных копий из этого места и переместит их в архивную папку.

Ранее я использовал FileSystemWatcher, но поскольку он не работает на серверах, я использую DirectoryInfo для поиска файлов.

Требуется запускать эту службу каждые 5 минут для поиска новых поступающих файлов резервных копий.

Я застрял с реализацией таймера.

Ниже приведен мой код:

Я хочу вызвать MoveToProcessed(processed) метод из ElapsedEventHandler. но я получаю ошибку 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 голосов
/ 23 мая 2019

Вы можете легко вызвать метод из обработчика событий, но сам метод обработчика событий должен соответствовать определенной сигнатуре.Для класса 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();
}
...