F # таймеры путаницы: кажется, есть несколько вариантов, как его использовать? - PullRequest
1 голос
/ 06 ноября 2019

У меня есть следующее в C #:

var timer = new Timer(x => { task.Invoke(); }, state, startDelay, interval);

Я пытаюсь сделать то же самое в F #, и из того, что я вижу в Интернете, есть таймер в System.Threading но есть также таймер в System.Timers и ... они оба называются Timer.

Это не скомпилируется:

let timer = new Timer
                (
                    fun x -> (printfn "hello"),
                    new Object(),
                    1000,
                    5000
                )

У меня естьУстановлено, что в System.Threading нужен тот, который нужен, но я не понимаю, в чем дело.

Ошибка здесь:

Program.fs (21, 34): [FS0001] Ожидается, что это выражение будет иметь тип 'unit', но здесь имеет тип '' a * 'b *' c * 'd'

Декомпилятор показывает это:

public Timer(TimerCallback callback, [Nullable(2)] object state, int dueTime, int period)
  : this(callback, state, dueTime, period, true)
{
}

Я совсем не понимаю ошибку. Что я делаю не так?

1 Ответ

2 голосов
/ 06 ноября 2019

Ты очень близко. Проблема, с которой вы сталкиваетесь (и это распространенная проблема), заключается в том, что C # поддерживает неявное преобразование из лямбды (x => { task.Invoke(); }) в экземпляр типа делегата TimerCallback. F #, как правило, не поддерживает неявное преобразование. Если вы создадите экземпляр делегата TimerCallback самостоятельно, вы увидите, что все работает нормально:

open System.Threading

let timer = new Timer(
          TimerCallback (fun _ -> printfn "hello"),
          null,
          1000,
          5000
        )
...