需要在窗体上不停修改 文本框的值。代码如下
for (int i = 0; i < 20; i++) {
lblCurrentIndex.Text = @"编号:" + i.ToString();
Thread.Sleep(1000);
}
可实际效果是:等全部执行完成后,才显示“编号:19”。这是因为for循环运行在主线程中,而刷新界面使用的就是i主线程是。尽管修改文本框的值有效,但界面没有刷新,等待for循环结束后,主线程才能刷新。
正确的做法:将耗时循环放在另一个线程中执行
var t1 = new Task(() =>
{
for (int i = 0; i < 20; i++)
{
_syncContext.Post(Ui, i);
Thread.Sleep(1000);
}
});
t1.Start();
由于不能再另一个线程对UI进行修改,使用SynchronizationContext完成跨线程UI修改
private readonly SynchronizationContext _syncContext;
public FormPointCheck()
{
InitializeComponent();
_syncContext = SynchronizationContext.Current;
}
public void Ui(object i)
{
lblCurrentIndex.Text = @"当前点编号:" + i.ToString();
}