2

这一定是一个非常愚蠢的问题。我正在尝试在新线程中运行一个耗时的过程,以便能够显示进度条。我以前从未使用过线程。我必须做错事,因为当我使用该.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()假设在初始化后快速返回正值)

我究竟做错了什么?先谢谢了。

4

1 回答 1

5

您正在 UI 线程上睡觉(您的按钮单击事件在 UI 线程上运行)。因为您的 UI 线程没有机会更新 Window(您只能休眠或设置一个值),所以您看不到任何变化。

尝试使用 aBackgroundWorker代替。
它提供了您可以在进度发生更改时处理的事件。您可以订阅事件ProgressChangedRunWorkerCompleted获得正在发生的事情的通知,并且可以从您的 BackgroundWorker 方法ReportProgress触发ProgressChanged事件。

有关更多信息和示例,请参见此处:

BackgroundWorker 的 MSDN 文档

于 2012-06-25T14:02:14.343 回答