public partial class Form1 : Form
{
private delegate void InvokeCallback(int pos); //定义回调函数(代理)格式
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Thread curThread = new Thread(DoParse);
this.progressBar1.Visible = true;
curThread.Start(this);
}
private void DoParse(object obj)
{
ParseAdjust p = new ParseAdjust();
p.Parse(obj);
}
//Invoke回调函数
public void UpdateProcessBar(int pos)
{
if (progressBar1.InvokeRequired)
{
progressBar1.Invoke(new InvokeCallback(UpdateProcessBar), new object[] { pos });//回调
}
else//当前线程是创建线程(界面线程)
{
progressBar1.Value = pos;//直接更新
}
}
}
================================
public class ParseAdjust
{
public ParseAdjust()
{
}
public bool Parse(object obj)
{
Form1 f = (Form1)obj;
f.UpdateProcessBar(20);
Thread.Sleep(3000);
f.UpdateProcessBar(60);
Thread.Sleep(2000);
f.UpdateProcessBar(100);
return false;
}
}
本文介绍了一个使用C#进行UI线程更新的例子,通过创建后台线程执行耗时任务,并通过委托调用更新进度条的方式确保UI响应性。示例中详细展示了如何正确地在非UI线程中安全地更新Windows窗体应用程序中的进度条。
3711

被折叠的 条评论
为什么被折叠?



