WPF анимация останавливается при запуске другого потока - PullRequest
1 голос
/ 02 июля 2010

У меня есть окно, которое показывает «рабочую» анимацию, когда работает другой поток.Окно показывает, и я вижу индикатор выполнения, но анимация заморожена.Код выполняется в ViewModel, и диспетчер создается в конструкторе:

_dispatcher = Dispatcher.CurrentDispatcher;

Код для создания анимации и запуска процесса выглядит следующим образом:

Working wrk;    
protected void Search()
{
  ImplementSearch();

  wrk = new Working();
  wrk.Owner = (MainWindow)App.Current.MainWindow;
  wrk.WindowStartupLocation = WindowStartupLocation.CenterOwner;
  wrk.HeadingMessage = "Searching...";
  wrk.UpdateMessage = "Running your search";
  wrk.ShowDialog();      
}

void ImplementSearch()
{
  System.Threading.Thread thread = new System.Threading.Thread(
    new System.Threading.ThreadStart(
      delegate()
      {
        System.Windows.Threading.DispatcherOperation
          dispatcherOp = _dispatcher.BeginInvoke(
          System.Windows.Threading.DispatcherPriority.Normal,
          new Action(
            delegate()
            {                  
              ResetSearch();

              string ret = _searchlogic.PerformSearch(SearchTerm, ref _matchingobjects, TypeOfFilter());
              if (ret != null)
                SearchMessage = ret;

              if (_matchingobjects.Count > 0)
              {
                DataRow row;
                foreach (SearchLogicMatchingObjects item in _matchingobjects)
                {
                  row = _dt.NewRow();
                  row["table"] = item.Table;
                  row["pk"] = item.PK;
                  _dt.Rows.Add(row);
                }

                SelectCurrent();
              }          
            }
        ));

        dispatcherOp.Completed += new EventHandler(dispatcherOp_Completed);
      }
  ));

  thread.Start();
}

void dispatcherOp_Completed(object sender, EventArgs e)
{
  wrk.Close();
}

Я могуне можете понять, почему анимация останавливается?Кто-нибудь может помочь?Спасибо

Ответы [ 2 ]

2 голосов
/ 02 июля 2010

Я думаю, что вы хотите выполнить реальную работу в фоновом потоке, а не маршалировать все в поток пользовательского интерфейса, что и делает BeginInvoke!Делая все в потоке пользовательского интерфейса с BeginInvoke, ваша анимация не запустится.

Working wrk;     
protected void Search() 
{ 
  ImplementSearch(); 

  wrk = new Working(); 
  wrk.Owner = (MainWindow)App.Current.MainWindow; 
  wrk.WindowStartupLocation = WindowStartupLocation.CenterOwner; 
  wrk.HeadingMessage = "Searching..."; 
  wrk.UpdateMessage = "Running your search"; 
  wrk.ShowDialog();       
} 

void ImplementSearch() 
{ 
    Thread thread = new Thread(new ThreadStart( 
      delegate() 
      { 
          // Call to function which changes UI - marshal to UI thread.
          _dispatcher.BeginInvoke((Action)(() => ResetSearch()));

          string ret = _searchlogic.PerformSearch(SearchTerm, ref _matchingobjects, TypeOfFilter()); 

          if (ret != null) 
          {
              // Call to function which changes UI - marshal to UI thread.
              _dispatcher.BeginInvoke((Action<string>)((r) => SearchMessage = r), ret);
          }

          if (_matchingobjects.Count > 0) 
          { 
            DataRow row; 
            foreach (SearchLogicMatchingObjects item in _matchingobjects) 
            { 
              row = _dt.NewRow(); 
              row["table"] = item.Table; 
              row["pk"] = item.PK; 
              _dt.Rows.Add(row); 
            }  

            // Call to function which changes UI - marshal to UI thread.
            _dispatcher.BeginInvoke((Action)(() => SelectCurrent()));
          }           
        } 

        wrk.Close();
  })); 
  thread.Start();
} 
0 голосов
/ 02 июля 2010

Ваша ветка не делает ничего полезного - используя _dispatcher.BeginInvoke для запуска поиска, вы эффективно выполняете поиск в потоке пользовательского интерфейса, который блокирует вашу анимацию. Используйте диспетчер из фонового потока только для операций, которые манипулируют элементами управления пользовательского интерфейса или вызывают события PropertyChanged.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...