再現が非常に難しい問題があります。
例外は次のとおりです。
e.Exception.Message = Object reference not set to an instance of an object.
e.Exception.StackTrace
at System.Windows.Controls.ItemContainerGenerator.MoveToPosition(GeneratorPosition position, GeneratorDirection direction, Boolean allowStartAtRealizedItem, GeneratorState& state)
at System.Windows.Controls.ItemContainerGenerator.Generator..ctor(ItemContainerGenerator factory, GeneratorPosition position, GeneratorDirection direction, Boolean allowStartAtRealizedItem)
App.cs App_DispatcherUnhandledException でそれをキャッチします
Visual Studio のすべてのオプションで Break on Thrown をオンにしているので、これは XAML によるものだと思います。
そして、すべてのコード ビハインドが Try Catch にラップされていると確信しています。
確かに、エラーが発生していると思われるページは、例外の背後にあるすべてのコードをキャッチしています。
これらのパブリック プロパティの取得を中断すると、エラーを再現できません。
試してデバッグするために速度を落とすと、再現が難しくなります。
TextBlock を使用してテキストを表示し、FlowDocumentViewer を使用して書式設定されたテキストを表示するタブをいくつか用意します。
ソースはパブリック プロパティにバインドされます。TextBlock.Text のパブリック プロパティは RawText で、バッキング変数は rawText です。
UI スレッドで作成された BackgroundWorker でテキストとテキストをフォーマットするための情報を取得します
。BackgroundWorker を呼び出す前に rawText を「テキストの取得」に設定し、BackgroundWorker が IsBusy の場合は CancelAsync() を呼び出します。
次に、RunWorkerCompletedEventHandler で rawText を実際のテキストに設定します。次に、そのタブが選択されている場合にのみ notifypropertychanged を呼び出すので、表示されていない場合はレンダリングされません。
問題は、コントロールが rawText を読み取っている間に、RunWorkerCompletedEventHandler の rawText を変更していることでしょうか? または、UI コントロールがテキストを読み取っている間に、rawText を「取得中のテキスト」に変更していますか?
そして他の考え?
それらの割り当てにロックを配置すると修正されますか?
MVVM ではありません。
私はコードを十分に説明したと思っていましたが、明らかにそうではありませんでした。
rawText = "getting text";
backgroundWorker.RunWorkerAsync(input);
次にRunWorkerCompletedで
DocTextAndHighlight docTextAndHighlight = (GabeLib.DocTextAndHighlight)e.Result;
rawText = docTextAndHighlight.RawText;
RawText の NotifyPropertyChanged は、そのタブが開いている場合にのみ呼び出されます。
ロックを追加し、エラーを再現できませんが、それがなくなったわけではありません。
本番環境でテストする必要があります。
また、私が疑うコントロールにパススルー変換を追加し、デバッグ メッセージを書き出しました。
何が例外をスローしているのかわかりませんが、例外は何も教えてくれません。
これは、DDE インターフェイスを備えた古い com コンポーネントである可能性があります。
1 つのメソッド呼び出しで、これとまったく同じエラーが報告されます。
1万分の1しか失敗しないメソッド呼び出しです。
しかし、失敗すると、ブロックで失敗します。
そして、その呼び出しは try catch ブロックにありますが、何らかの理由で直接ブロックにキャッチされません。エラーの情報はほとんどありませんが、まったく同じエラーです。悪い点は、アプリがクラッシュすることです。
e.Handled = true; を設定できます。ただし、アプリをクラッシュさせるのに十分な回数、エラーがスローされます。