Вам следует использовать System.Windows.Forms.Timer
, если вы хотите периодически что-то обновлять в форме. Укажите желаемый интервал времени срабатывания таймера, добавьте обработчик событий Tick
(который обновляет текст в текстовом поле) и запустите таймер:
let form = new Form()
let textBox = new TextBox(Text = "Hello, world.")
form.Controls.Add textBox
let mutable value = 0 // counter
let timer = new Timer(Interval = 1000) // this timer will fire tick events each second
timer.Tick.Add <| fun _ -> // you can ignore argument which is passed to handler
value <- value + 1
textBox.Text <- sprintf "Hello, World. %i" value
timer.Start()
Application.Run(form)
Почему ваш образец не работает? Прежде всего Application.Run
блокирует дальнейшее выполнение, пока вы не закроете открытую форму. Но даже если вы будете использовать form.Show()
для выполнения рекурсивной функции во время отображения формы, вы увидите, что форма застряла и не обновилась. Потому что вы замораживаете основной поток на Thread.Sleep
, а форма не может обрабатывать события и перерисовывать себя. form.Refresh()
позволит вам увидеть обновления, но между ними форма не будет реагировать. Кроме того, вам не нужно добавлять textBox
для формирования элементов управления на каждой итерации.