web-dev-qa-db-ja.com

0x88980406 SyncFlush()...回避策はありますか?

アプリケーションでこの例外が発生します。ウェブ上でそれについて議論しているリンクを見つけましたが、それを追跡する方法や回避する方法を示すものは何もありません。

インターネットからのリンクで返信しないでください。ソースを追跡する戦略を返信してください。回避策を見つけた場合は、回避策を返信してください。

Source: PresentationCore
Message: Exception from HRESULT: 0x88980406
Stack Trace:
   at System.Windows.Media.Composition.DUCE.Channel.SyncFlush()
   at System.Windows.Interop.HwndTarget.UpdateWindowSettings(Boolean enableRenderTarget, Nullable`1 channelSet)
   at System.Windows.Interop.HwndTarget.UpdateWindowPos(IntPtr lParam)
   at System.Windows.Interop.HwndTarget.HandleMessage(WindowMessage msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Interop.HwndSource.HwndTargetFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
20
cbuteau

私の場合、問題のアプリケーションは、特定のハードウェアのメモリ制限をすでに押し上げていたことが判明しました。適切な量​​のメモリを使用するコードを追加すると、これが発生します。

画像バッファの処理を別のスレッドに配置する機能を実装したときに、MemoryFailPointメカニズムを使用することになりました。

http://msdn.Microsoft.com/en-us/library/system.runtime.memoryfailpoint.aspx

最初の実装でうまくいきましたが、何度も試行した後、QAによってOOM爆弾が発生しました。そこで、GC.Collect()ループを使用してMemoryFailPoint()を実装しました(私が知っているハックは...しかし時々...やり遂げる)。

私が学んだ主なことは... a)これはWPFの本当に悪いバグです。 b)本当に膨大な量のメモリを消費した場合にのみ、心配する必要があります。

6
cbuteau

これは古いですが、解決したのと同じ問題があったので、とにかく答えます。 https://stackoverflow.com/a/18003004/1415307

基本的に、このエラーに関する私の問題は、古いビデオカードドライバに起因していました。最新のドライバーに更新した後、問題は解決されました。

8
TrialAndError

Microsoftの優れた支援により、1年以上悩まされてきたSyncFlushの問題を解決しました。ネイティブコードでマルチメディアタイマーを作成していたことが判明しましたが、毎回それらを解放していませんでした。具体的には、timeBeginPeriodとtimeEndPeriodを呼び出しましたが、beginをendよりも多く呼び出したため、リソースリークが発生しました。 WPFレンダリングスレッドはこれらのタイマーを使用する必要がありますが、限られた量(おそらく65k)を使い果たしました。その結果、レンダリングスレッドがレンダリングを停止し、ハングするかクラッシュを引き起こしました。タイマーに気をつけろ!

1
Dale Barnard