这一定是一个非常愚蠢的问题。我试图在一个新线程中运行一个耗时的过程,所以我将能够显示进度条。我以前从未使用过线程。我必须做错事,因为当我使用.Start()
方法时似乎没有任何事情发生。
private void btnStart_Click(object sender, EventArgs e)
{
clsScrap oScrap = new clsScrap(txtInputFilename.Text,txtImgSrc.Text);
Thread ScrapThread = new Thread(new ThreadStart(oScrap.Scrap));
ScrapThread.Start();
while (oScrap.GetLinkCount() < 0) ;
myProgressBar.Minimum = 1;
myProgressBar.Maximum = oScrap.GetLinkCount();
while (ScrapThread.IsAlive)
{
Thread.Sleep(1000 * 30);
myProgressBar.Value = oScrap.GetCurrLinkNo();
}
}
我在oScrap.Scrap()的开头放了一个断点,但它永远不会到达那里。在ScrapThread.Start();
行之后,它只会移动到下一个while循环并卡在那里(函数oScrap.GetLinkCount()
假设在初始化后快速返回正值)
我做错了什么? 谢谢你提前。
答案 0 :(得分:5)
您正在UI线程上睡觉(您的按钮单击事件在UI线程上运行)。因为您的UI线程没有机会更新Window(您只是睡眠或设置一个值),所以您看不到任何更改。
请尝试使用BackgroundWorker
它提供了可在Progress更改时处理的事件。您可以订阅活动ProgressChanged
和RunWorkerCompleted
以获得有关正在发生的事件的通知,并且您可以通过BackgroundWorker方法ReportProgress
触发ProgressChanged
活动。
请点击此处了解更多信息和示例: