XamlReader.負荷を背景にねじになります。高校を卒業したばかりです。

StackOverflow https://stackoverflow.com/questions/5395264

質問

るコンポーネントのラインナップアプリの操作読み込みユーザーの管理から、別のファイルを使用 XamlReader.Load() 方法:

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

の過程で少し時間がかかりによるファイルのサイズは、UIが凍結された複数秒です。

のためのアプリに対応し利用するようにして背景のスレッドの一部動作しない直接involedにUIを更新中です。

しようとした場合に利用 BackgroundWorker 私はエラー: ッドは、呼び出し側スレッドが必要駅には数多くのUIコンポーネントを必要とす

行ったのもあることが少なくない。

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

この解決なしで時間のかかる作業はUI。

またこのように、すべての構文解析の背景

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

私は例外: ッドは、呼び出し側スレッドがアクセスできないこのオブジェクトが別のスレッドが所有します。 (ロードUserControlが他のコントロールの現するかのエラー)

、本当にありがとうをこの操作などのUIに対応すること?

役に立ちましたか?

解決

XAMLをAバックグラウンドスレッドのロードに取得することは、本質的に非スターターです。 WPFコンポーネントにはスレッドアフィニティがあり、一般に作成されたスレッドからのみ使用可能です。したがって、バックグラウンドスレッドにロードすると、UIが応答性が高くなりますが、コンポーネントを作成すると、UIスレッドに接続できません。

ここに最適なオプションは、XAMLファイルを小さなピースに分割し、UIスレッドに段階的にロードすることです。おそらく使用 BeginInvokeDispatcher 負荷をスケジュールするオブジェクト。

他のヒント

ご存知のように、使用できません XamlReader.Load スレッドがstaである場合でも、たとえそうであっても、メッセージポンプを起動し、それを通して作成したコントロールへのすべてのアクセスをファンネルに送信する必要があります。これは、WPFがどのように機能するかの基本的な方法であり、それに反することはできません。

したがって、あなたの唯一の本当の選択肢は次のとおりです。

  1. XAMLを小さなピースに分解します。
  2. それぞれの新しいSTAスレッドを開始します Load 電話。後 Load 返品すると、スレッドはメッセージループを起動し、作成したコントロールを管理する必要があります。アプリケーションは、さまざまなコントロールがさまざまなスレッドによって所有されているという事実を考慮する必要があります。

正確な解決策はありませんが、次のリンクからある程度の方向性を得ることができます。

http://www.codehosting.net/blog/blogengine/post/opening-wpf-windows-on-a-new-thread.aspx

http://eprystupa.wordpress.com/2008/07/28/running-wpf-application-with-multiple-ui-threads/

システム。発想は、 Xaml​Background​Reader クラスから得ることです。パーサーの背景のスレッドが構築のオブジェクトのUI。

別のスレッドを制御できるようにする方法を呼び出すことができます。

http://msdn.microsoft.com/en-us/library/ms748331.aspx

.freeze()と呼ばれます

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top