【问题标题】:C# Loading screen / Threading issueC# 加载屏幕/线程问题
【发布时间】:2011-10-12 15:13:48
【问题描述】:

在我的主表单加载之前,它会要求用户检查更新。当他们点击确定时,我会显示主窗体并制作一个包含一些标签和一个带有动画 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;

【问题讨论】:

    标签: c# winforms multithreading picturebox animated


    【解决方案1】:

    问题是 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
      }
    }
    

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多