C# 线程未启动

C# 线程未启动,c#,winforms,multithreading,C#,Winforms,Multithreading,这一定是个愚蠢的问题。我正在尝试在一个新线程中运行一个耗时的进程,以便能够显示进度条。我以前从未使用过线程。我一定是做错了什么,因为当我使用.Start()方法时,似乎什么都没有发生 private void btnStart_Click(object sender, EventArgs e) { clsScrap oScrap = new clsScrap(txtInputFilename.Text,txtImgSrc.Text); Thread ScrapThread = n

这一定是个愚蠢的问题。我正在尝试在一个新线程中运行一个耗时的进程,以便能够显示进度条。我以前从未使用过线程。我一定是做错了什么,因为当我使用
.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();
    }
}
private void btnStart\u单击(对象发送方,事件参数e)
{
clsScrap oScrap=新的clsScrap(txtInputFilename.Text,txtImgSrc.Text);
螺纹报废螺纹=新螺纹(新螺纹开始(oScrap.Scrap));
ScrapThread.Start();
while(oScrap.GetLinkCount()<0);
myProgressBar.最小值=1;
myProgressBar.Maximum=oScrap.GetLinkCount();
while(ScrapThread.IsAlive)
{
线程。睡眠(1000*30);
myProgressBar.Value=oScrap.GetCurrLinkNo();
}
}
我在oScrap.Scrap()的开头放了一个断点,但它从未到达那里。在
ScrapThread.Start()之后行它只是移动到下一个while循环并卡在那里(函数
oScrap.GetLinkCount()
假设在初始化后快速返回正值)

我做错了什么?
感谢高级版。

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

尝试改用
后台工作人员

它提供了进度发生变化时可以处理的事件。您可以订阅这些事件并获得正在发生的事情的通知,还可以通过BackgroundWorker方法触发
ProgressChanged
事件

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


谢谢您的回答。是的,我考虑过使用backgroundworker,但我需要执行一个很长的过程(oScrap.scrape()可能需要几个小时),在它完成之前,我无法更改后台工作人员的进度。我不明白的是为什么ScrapThread.Start();不调用oScrap.Scrap()方法。不仅进度条没有更改,而且oScrap.Scrap()也不会产生任何结果。抱歉把简单的事情复杂化了我是新手。非常感谢您的帮助,非常感谢。进度条没有更改,因为UI线程没有机会重新绘制进度条。如果这是一个很长的过程,那么显示一些UI来通知用户。后台工作程序的进度正好是您设置到progressbar的值。