【发布时间】:2015-09-30 03:03:00
【问题描述】:
我正在学习使用线程并制作一些多线程演示。
我有一个名为 lblText 的标签和一个名为 pgbRun 的选框进度条。我做了2个线程,一个让标签的文本在每个Thread.Sleep()被调用后改变,另一个让进度条在标签的文本改变时显示动画。
我遇到的问题是文本更改线程似乎运行良好,但进度条线程有问题。 pgbRun 只是在文本更改完成后开始制作动画。
请帮我找出我的代码有什么问题,并告诉我一些修复它的方法。非常感谢!
private delegate void formDelegate();
private void btnRun_Click(object sender, EventArgs e)
{
Thread thread = new Thread(new ThreadStart(new formDelegate(textChange)));
thread.IsBackground = true;
thread.Start();
}
public void textChange()
{
if (lblText.InvokeRequired)
{
lblText.BeginInvoke(new formDelegate(textChange));
}
else
{
Thread thread = new Thread(new ThreadStart(new formDelegate(progess)));
thread.IsBackground = true;
thread.Start();
//I try make single thread that config progress bar here but i have same trouble.
for (int i = 0; i < 10; i++)
{
lblText.Text = "Count: " + i;
lblText.Update();
lblText.Refresh();
Thread.Sleep(300);
}
}
}
public void progess()
{
if (pgbRun.InvokeRequired)
{
pgbRun.BeginInvoke(new formDelegate(progess));
}
else
{
pgbRun.Style = ProgressBarStyle.Marquee;
pgbRun.MarqueeAnimationSpeed = 20;
pgbRun.Update();
pgbRun.Refresh();
}
}
【问题讨论】:
-
您的线程不会做任何有用的事情,它们会立即调用 UI 线程。 textChange() 代码没有完成更多工作,但会导致 UI 挂起 3 秒。您可以看到标签更改,因为您调用了 Update()。 progess() 中的 BeginInvoke() 调用被卡住了 3 秒钟,因为 UI 线程正忙于睡眠,因此您看不到进度条发生任何事情。你需要把这段代码扔掉。
-
@HansPassant 那么我该如何解决呢?
标签: c# multithreading winforms progress-bar marquee