2013-03-07 3 views
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 с задержкой в ​​пять секунд:

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 секунд после сообщения приветствия.

Почему это замораживает графический интерфейс?

+2

Что вы думаете 'uiCurrent.Post' делает? – SLaks

ответ

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; 
    } 
} 
+0

Это было точно! Мне нужен uiCurrent, потому что если нет, ему принадлежит другой поток (основной), и я не могу их модифицировать. Но я решил это! Большое спасибо! PS: Когда мне позволено, я отправлю ваш ответ как хороший. – Sonhja

4

Вы явно побеждаете цель работника фона.

Ваш код переключается обратно в поток пользовательского интерфейса в обратном вызове и делает все.

Смежные вопросы