XamlReader.負荷を背景にねじになります。高校を卒業したばかりです。
-
28-10-2019 - |
質問
るコンポーネントのラインナップアプリの操作読み込みユーザーの管理から、別のファイルを使用 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スレッドに段階的にロードすることです。おそらく使用 BeginInvoke
に Dispatcher
負荷をスケジュールするオブジェクト。
他のヒント
ご存知のように、使用できません XamlReader.Load
スレッドがstaである場合でも、たとえそうであっても、メッセージポンプを起動し、それを通して作成したコントロールへのすべてのアクセスをファンネルに送信する必要があります。これは、WPFがどのように機能するかの基本的な方法であり、それに反することはできません。
したがって、あなたの唯一の本当の選択肢は次のとおりです。
- XAMLを小さなピースに分解します。
- それぞれの新しいSTAスレッドを開始します
Load
電話。後Load
返品すると、スレッドはメッセージループを起動し、作成したコントロールを管理する必要があります。アプリケーションは、さまざまなコントロールがさまざまなスレッドによって所有されているという事実を考慮する必要があります。
システム。発想は、 XamlBackgroundReader
クラスから得ることです。パーサーの背景のスレッドが構築のオブジェクトのUI。
別のスレッドを制御できるようにする方法を呼び出すことができます。
http://msdn.microsoft.com/en-us/library/ms748331.aspx
.freeze()と呼ばれます