0

ユーザーを検証する WPF アプリケーションがあります。そのユーザーが正常に認証されると、インターフェイスが変化し、ユーザーに挨拶します。そのウェルカム メッセージを 5 秒間表示してから、別のコンテンツに変更したいと考えています。これは、次を起動するウェルカム メッセージですBackgroundWorker

LabelInsertCard.Content = Cultures.Resources.ATMRegisterOK + " " + user.Name;
ImageResult.Visibility = Visibility.Visible;
ImageResult.SetResourceReference(Image.SourceProperty, "Ok");
BackgroundWorker userRegisterOk = new BackgroundWorker
   {
        WorkerSupportsCancellation = true,
        WorkerReportsProgress = true
   };
userRegisterOk.DoWork += userRegisterOk_DoWork;
userRegisterOk.RunWorkerAsync();

そして、これは私BackgroundWorkerの5秒の遅延です:

void userRegisterOk_DoWork(object sender, DoWorkEventArgs e)
    {
        if (SynchronizationContext.Current != uiCurrent)
        {
            uiCurrent.Post(delegate { userRegisterOk_DoWork(sender, e); }, null);
        }
        else
        {
            Thread.Sleep(5000);

            ImageResult.Visibility = Visibility.Hidden;
            RotatoryCube.Visibility = Visibility.Visible;
            LabelInsertCard.Content = Cultures.Resources.InsertCard;
        }
    }

しかし、Backgroundworker は私の GUI を 5 秒間フリーズさせます。明らかに、私がやりたいことは、ウェルカム メッセージの 5 秒後にワーカー内でコードを起動することです。

GUI がフリーズするのはなぜですか?

4

2 に答える 2

4

バックグラウンドワーカーの目的を明示的に無効にしています。

コードはコールバックで UI スレッドに戻り、そこですべてを実行します。

于 2013-03-07T16:57:33.927 に答える
3

多分これはあなたが意図したものです:

void userRegisterOk_DoWork(object sender, DoWorkEventArgs e)
{
    if (SynchronizationContext.Current != uiCurrent)
    {
        // Wait here - on the background thread
        Thread.Sleep(5000);
        uiCurrent.Post(delegate { userRegisterOk_DoWork(sender, e); }, null);
    }
    else
    {
        // This part is on the GUI thread!!
        ImageResult.Visibility = Visibility.Hidden;
        RotatoryCube.Visibility = Visibility.Visible;
        LabelInsertCard.Content = Cultures.Resources.InsertCard;
    }
}
于 2013-03-07T17:00:00.763 に答える