Winforms 运行Windows窗体后如何更新它们?C#或F#

Winforms 运行Windows窗体后如何更新它们?C#或F#,winforms,f#,Winforms,F#,使用下面的代码,我试图每秒在文本框中打印I,但它不会更新文本框。我错过什么了吗 open System open System.Drawing open System.Windows.Forms open System.Threading let form = new Form() let textBox = new TextBox() textBox.Text <- "Hello, World." form.Controls.Add textBox Application.Ru

使用下面的代码,我试图每秒在文本框中打印I,但它不会更新文本框。我错过什么了吗

open System
open System.Drawing
open System.Windows.Forms
open System.Threading

let form = new Form()

let textBox = new TextBox()

textBox.Text <- "Hello, World."

form.Controls.Add textBox

Application.Run form

let rec main i =
    Thread.Sleep(1000)
    textBox.Text <- sprintf "Hello, World. %i" i
    form.Controls.Add textBox
    main (i + 1)

main 0
开放系统
开放系统.绘图
打开System.Windows.Forms
开放系统。线程
let form=新表单()
让textBox=newtextbox()

textBox.Text如果要定期更新表单上的内容,应使用
System.Windows.Forms.Timer
。提供所需的计时器计时间隔,添加
计时
事件处理程序(更新文本框中的文本),然后启动计时器:

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)
let form=new form()
let textBox=new textBox(Text=“你好,世界。”)
form.Controls.Add文本框
设可变值=0//计数器
let timer=new timer(Interval=1000)//此计时器每秒将触发滴答事件
timer.Tick.Add//您可以忽略传递给处理程序的参数

值如果要定期更新表单上的内容,应使用
System.Windows.Forms.Timer
。提供所需的计时器计时间隔,添加
计时
事件处理程序(更新文本框中的文本),然后启动计时器:

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)
let form=new form()
let textBox=new textBox(Text=“你好,世界。”)
form.Controls.Add文本框
设可变值=0//计数器
let timer=new timer(Interval=1000)//此计时器每秒将触发滴答事件
timer.Tick.Add//您可以忽略传递给处理程序的参数

值为什么不使用?为什么将其标记为C#?
应用程序。Run
是一个阻塞调用(所谓的消息循环)。之后的代码基本上会在应用程序退出时执行(当主窗体关闭时)。重申@IvanStoev所说的:在Windows窗体应用程序中,有一个“消息循环”将事件分派给处理程序。它依赖于处理程序快速处理事件并将控制权返回表单基础结构(即循环)。Windows窗体的另一个特点是,所有UI和大多数/所有处理程序都运行在同一个线程上(即主线程或UI线程)。您正在该线程上调用
Sleep
,阻止UI更新,然后更新表单,然后休眠。如果您使用Windows窗体计时器(它与WinForms配合得很好),那么就应该看看:为什么您不使用?为什么它被标记为C#?
应用程序。Run
是一个阻塞调用(所谓的消息循环)。之后的代码基本上会在应用程序退出时执行(当主窗体关闭时)。重申@IvanStoev所说的:在Windows窗体应用程序中,有一个“消息循环”将事件分派给处理程序。它依赖于处理程序快速处理事件并将控制权返回表单基础结构(即循环)。Windows窗体的另一个特点是,所有UI和大多数/所有处理程序都运行在同一个线程上(即主线程或UI线程)。您正在该线程上调用
Sleep
,阻止UI更新,然后更新表单,然后休眠。如果您使用的是Windows窗体计时器(它与WinForms配合得很好),那么事情应该可以正常工作。请看一看:非常感谢,我刚刚看到了这个答案。这对我帮助很大,我现在可以做得更多。谢谢非常感谢,我刚刚看到了这个答案。这对我帮助很大,我现在可以做得更多。谢谢