Gui在使用线程时冻结

我被困住了,希望有人可以帮助我。

我已经制作了一个类/ gui,其加载条设置为选取框,这样当执行任务时我可以将其显示给用户。

在我的一个gui类中,在第一行的构造函数中,我正在创建此类的新实例然后执行

LoadingBar bar = new LoadingBar(); Thread thread = new Thread(bar.Show); thread.Start(); 

然而,即使主程序线程正在做一些更密集的东西,这个gui似乎仍然冻结,即使我使用backround worker。

我提到的方法有什么问题,如果有的话,我需要改变什么?

谢谢

你需要改变你的方法。 当工作在“工作线程”(通常是BackGroundWorker)中完成时,GUI需要保留在主线程中。 然后工作人员向GUI报告然后更新。

你最好做相反的事情。 在线程(或后台工作程序)中进行密集工作,并在主应用程序线程中显示等待屏幕。

您需要使用BackgroundWorker 。 将一个拖到表单上,单击backgroundWorker1并将WorkerReportsProgress属性设置为True

然后转到事件(通过属性窗口)并附加处理程序

  • DoWork ,这是进度条代表的所有工作。 您将通过此“报告进度”,后台工作人员将确保在UI线程上调用ProgressChanged。
  • ProgressChanged ,您可以根据报告给该方法的进度和状态数据更新UI

DoWork事件看起来像这样

 private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) { var userState = new StateClass(); while (working) { // TODO: do work here // update the state surrounding this task via userState userState.property = "some status"; // report the progress so that backgroundWorker1_ProgressChanged gets called this.backgroundWorker1.ReportProgress(percentComplete, userState); } } 

ProgressChanged事件看起来像这样

 private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) { // e.UserState contains the state data you passed to ReportProgress, // you have to cast it to the right type though, since its of type object var userState = (StateClass)e.UserState; int progress = e.ProgressPercentage; // TODO: report progress to the UI with the above variables } 

现在你所要做的就是告诉后台工作者通过调用this.backgroundWorker1.RunWorkerAsync()来做工作。

我不认为你在后台工作者中做你所有的工作,或者GUI不会冻结。 我们需要查看更多代码,或者您需要再次查看后台工作程序示例以查看可能出现的问题。

编辑

添加对System.Threading.Thread.Sleep(1);的调用System.Threading.Thread.Sleep(1); 报告进度调用后