C#加载屏幕/线程问题

时间:2011-10-12 15:13:48

标签: c# winforms multithreading picturebox animated

在我的主表单加载之前,它会要求用户检查更新。当他们点击确定后,我将主窗体显示并制作一个包含一些标签的面板和一个带有GIF动画的图片框。

动画gif没有移动,这通常是因为主线程正在忙碌但是我已经完成了线程的工作并且没有运气来制作动画。

这就是我所拥有的。

Thread CheckVersion = new Thread(new ThreadStart(VersionCheck));
this.Show(); //bring up the main form
this.BringToFront();
pCheckingVersions.Visible = true; //this contains the animated gif
Application.DoEvents(); //refresh ui so my box
CheckVersion.Start(); //start thread
CheckVersion.Join(); //wait for thread to exit before moving on
pDownloading.Visible = false;

2 个答案:

答案 0 :(得分:3)

问题是Thread.Join()将阻塞调用线程,直到你正在等待的线程完成。

相反,您应该为这种活动使用异步模型。 BackgroundWorker在这里是理想的:

class MyForm
{
  private BackgroundWorker _backgroundWorker;

  public Myform()
  {
    _backgroundWorker = new BackgroundWorker();
    _backgroundWorker.DoWork += CheckVersion;
    _backgroundWorker.RunWorkerCompleted += CheckVersionCompleted;

    // Show animation
    // Start the background work
    _backgroundWorker.DoWork();
  }

  private void CheckVersion()
  {
    // do background work here
  }

  private CheckVersionCompleted(object sender, RunWorkerCompletedEventArgs e)
  {
    // hide animation
    // do stuff that should happen when the background work is done
  }
}

这只是一个实现的粗略示例,但与我过去所做的很多相似。

答案 1 :(得分:2)

CheckVersion.Join()调用使您的UI线程等待CheckVersion线程完成,这会阻塞。这使得GIF动画暂停。

尝试使用BackgroundWorker类,并使用RunWorkerCompleted事件向UI线程发出后台操作已完成的信号。