XamlReader.Load em um thread em segundo plano. É possível

Um aplicativo WPF possui uma operação de carregamento de um controle de usuário de um arquivo separado usandoXamlReader.Load() método:

StreamReader mysr = new StreamReader(pathToFile);
DependencyObject rootObject = XamlReader.Load(mysr.BaseStream) as DependencyObject;
ContentControl displayPage = FindName("displayContentControl") as ContentControl;
displayPage.Content = rootObject;

O processo leva algum tempo devido ao tamanho do arquivo, para que a interface do usuário fique congelada por vários segundo

Para manter o aplicativo responsivo, tento usar um encadeamento em segundo plano para executar a parte da operação que não é diretamente envolvida na atualização da interface do usuári

Ao tentar usarBackgroundWorker Eu recebi um erro: O segmento de chamada deve ser STA, porque muitos componentes da interface do usuário exigem isso

Então, eu fui por outro caminho:

 private Thread _backgroundThread;
 _backgroundThread = new Thread(DoReadFile);
 _backgroundThread.SetApartmentState(ApartmentState.STA);
 _backgroundThread.Start();
 void DoReadFile()
 {
   StreamReader mysr3 = new StreamReader(path2);
   Dispatcher.BeginInvoke(
           DispatcherPriority.Normal,
           (Action<StreamReader>)FinishedReading,
           mysr3);
 }

 void FinishedReading(StreamReader stream)
    {            
        DependencyObject rootObject = XamlReader.Load(stream.BaseStream) as DependencyObject;
        ContentControl displayPage = FindName("displayContentControl") as ContentControl;
        displayPage.Content = rootObject;
    }

Isso não resolve nada porque todas as operações demoradas permanecem no thread da interface do usuári

Quando tento assim, faço todas as análises em segundo plano:

private Thread _backgroundThread;
_backgroundThread = new Thread(DoReadFile);
_backgroundThread.SetApartmentState(ApartmentState.STA);
_backgroundThread.Start();
 void DoReadFile()
 {
  StreamReader mysr3 = new StreamReader(path2);      
  DependencyObject rootObject3 = XamlReader.Load(mysr3.BaseStream) as DependencyObject;
        Dispatcher.BeginInvoke(
           DispatcherPriority.Normal,
           (Action<DependencyObject>)FinishedReading,
           rootObject3);
  }

  void FinishedReading(DependencyObject rootObject)
  {            
    ContentControl displayPage = FindName("displayContentControl") as ContentControl;
    displayPage.Content = rootObject;
  } 

Eu tenho uma exceção: O thread de chamada não pode acessar este objeto porque ele possui um thread diferent (no UserControl carregado, há outros controles presentes que podem dar o erro)

Existe alguma maneira de executar esta operação de maneira que a interface do usuário seja responsiv

questionAnswers(5)

yourAnswerToTheQuestion