1

実稼働マシンでのアプリケーションの起動時に問題が発生することがあります。アプリケーションが起動するたびに発生するわけではなく、明らかに再起動時にのみ発生します。アプリケーションはログインから開始され、HKLM \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion\Runに追加されます。

どうやら、問題は再起動中よりもマシンをリセットするときに頻繁に発生します。クラッシュ後にアプリケーションを手動で起動すると成功します。

起動時に次の例外がスローされます。

'System.Windows.Controls.TextBlock'の初期化により、例外がスローされました。System.Windows.Markup.XamlParseException:「System.Windows.Controls.TextBlock」の初期化で例外がスローされました。---> System.InvalidOperationException:別のスレッドがオブジェクトを所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません。System.Windows.Threading.Dispatcher.VerifyAccess()at System.Windows.Style.Seal()at System.Windows.StyleHelper.UpdateStyleCache(FrameworkElement fe、FrameworkContentElement fce、Style oldStyle、Style newStyle、Style&styleCache)at System.Windows .FrameworkElement.OnStyleChanged(DependencyObject d、DependencyPropertyChangedEventArgs e)at System.Windows.DependencyObject.OnPropertyChanged(DependencyPropertyChangedEventArgs e)atSystem.Windows.FrameworkElement。 at Exception.Occurs.At.Different.Origins.Between.Startup()

StackTraceからわかるように、スタイルキャッシュの更新中に何かが起こっています。私は自分のコンピューターでこれを再現することができませんでした。アプリケーションの起動中にここに関係するスレッドはありませんが、いくつかのAppDomainがあります。例外の発生源は常に同じではありませんが、Application.LoadComponent(Object component、Uri resourceLocator)からはまったく同じです。

アプリケーションは、OSに応じて実行可能ファイル(.. \ ProgramData ....)とは異なる場所から構成ファイルを見つける必要があるため、別のAppDomainを使用して、構成ファイルを探す場所を指示します。 ConfigurationManagerにファイルを探す場所を指示するより良い解決策を見つけることができませんでした。もちろん、これに関連している可能性がありますが、必ずしもそうとは限りません。編集:ConfigurationManager.OpenMappedExeConfigurationは、Properties.Settings.Defaultなどからアクセスしたユーザーまたはアプリケーションの設定を更新しないため、機能していないようです。

誰かがこれに対処する方法について何か提案や推奨事項がありますか?申し訳ありませんが、複製用のサンプルを提供することはできません。

4

3 に答える 3

1

その例外は、ビジュアル要素ではないスレッドからビジュアル要素を変更しているためです。あなたの例外の最初の行でそれが言ったので、私はこれを知っています:

Initialization of 'System.Windows.Controls.TextBlock' threw an exception. System.Windows.Markup.XamlParseException: Initialization of 'System.Windows.Controls.TextBlock' threw an exception. ---> System.InvalidOperationException: The calling thread cannot access this object because a different thread owns it.

残りのすべての例外は重要ではありません。初期設定を読み込んでから、他のスレッドを使用していると思います。ランダムな動作は、コントロールがロードされる前に構成を見つけた場合である可能性があるTextBlockため、今回は例外はスローされません。

これを解決するには、この質問と、私が提供する最後の回答(を使用するものでSynchronizationContext、複数のスレッドを使用するWPFアプリケーションで実際に機能するもの)を確認してください。明確なコメントがない場合は、ここに解決策を書きます。

この答えがそのランダムエラーを見つけるのに役立つことを願っています、それは最悪です...

于 2012-11-23T18:21:07.553 に答える
0

この例外の原因はわかりませんが、問題の回避策があります。

AppDomain別の構成ファイルをロードするためだけに別のファイルを作成する代わりに、ConfigurationManager.OpenMappedExeConfigurationを使用して、ローカルファイルシステムのどこからでも任意の.configファイルをロードできます。

次のように使用します。

//Map the new configuration file.
var configFileMap = new ExeConfigurationFileMap() { ExeConfigFilename = @"c:\myOther.config"};

//Get the mapped configuration file
System.Configuration.Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configFileMap, ConfigurationUserLevel.None);

config.GetSection()読み取り専用で使用する特定のセクションを取得するために使用するか、実行時に構成を変更するためにオブジェクトを直接使用しますconfig

また、別のAppDomainは必要ありません。これは、起動時間が短縮されることを意味します:)

于 2012-11-22T23:16:35.130 に答える
0

構成ファイルを指定するために使用された余分なAppDomainを取り除き、このリンクで指定されたメソッドに置き換えることで問題を解決しました。

于 2013-01-09T16:27:48.513 に答える