0

メイン フォームが読み込まれる前に、ユーザーに更新を確認するように求めます。[OK] をクリックすると、メイン フォームが表示され、いくつかのラベルとアニメーション 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;
4

2 に答える 2

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
  }
}

これは実装の大まかな例に過ぎませんが、私が過去に行った多くの例と同様です。

于 2011-10-12T15:30:26.723 に答える
2

CheckVersion.Join() 呼び出しにより、UI スレッドが CheckVersion スレッドの完了を待機し、ブロックされます。これにより、GIF アニメーションが一時停止します。

BackgroundWorkerクラスを使用してみて、RunWorkerCompletedイベントを使用して、バックグラウンド操作が完了したことを UI スレッドに通知します。

于 2011-10-12T15:21:25.273 に答える