Внутри вашего обработчика событий F # Timer.Elapsed
ваша последняя строка равна timeEvent
(без параметров), и из остального вашего кода я вижу, что timeEvent
- это Action
, который был преобразован в функцию F #,Поскольку вы не записали никаких параметров после timeEvent
, то, что делает эта строка, указывает значение из timeEvent
в качестве возвращаемого значения обработчика события, т.е. ваш обработчик события возвращает функцию.Или вернет функцию, если обработчики событий вернут что-то отличное от void
(или unit
в терминах F #).Поскольку они не подозревают, что у вас есть предупреждение в этой строке timeEvent
, которое говорит о том, что значение timeEvent
по своей сути игнорируется.
Кроме того, ваша строка timer.Elapsed.Add
в F # выглядитнеправильно со мной.Метод Add
для событий принимает параметр типа 'T -> unit
, где 'T
- это любой тип данных, который предоставляет вам событие: в случае события Elapsed
на таймерах это будет экземпляр ElapsedEventArgs
,То, что вы должны передать Add
, это fun elapsedEventArgs -> ...
.А затем вы изменили бы строку timeEvent
, чтобы фактически передать ей параметр (те же самые elapsedEventArgs
), чтобы он вызывался и действительно что-то делал.
Кроме того, всякий раз, когда вы уменьшаете число исравнивая его с 0, я всегда предпочитаю проводить сравнение как <=
, а не =
, просто на случай, если позже я изменю свой код так, что это может привести к тому, что уменьшение будет происходить дважды.Если мое сравнение равно = 0
, а двойной декремент принимает число от 1 до -1, ветвь if x = 0
не сработает.Но если я сравниваю с <= 0
, то это сработает, даже если я совершу ошибку в другом месте.Поэтому я бы предложил написать if time <= 0
вместо if time = 0
.
Другими словами, я думаю, что ваш обработчик событий timer.Elapsed
должен выглядеть следующим образом:
timer.Elapsed.Add(fun evtArgs ->
time <- time - 1
if time <= 0
then
timer.Stop()
timer.Dispose()
else
()
timeEvent evtArgs
)