以下代码将在应用程序进行处理时调用另一个线程以显示进度窗口。如果我们多次执行,例如超过50次,则会抛出异常。
这是我们的代码-BusyIndicatorHelper.ShowProgWindowCustomSize作为异常抛出,并将调用以下代码。
这将调用ShowProgWindowCustomSize(currentWindow),如以下所示。
以下是抛出outofmemory异常的情况。
应用程序: BioMedicalVerification.exe 框架版本: v4.0.30319 描述: 由于未处理的异常,进程已终止。 异常信息: System.OutOfMemoryException 堆栈: System.Windows.Media.Composition.DUCE+Channel.SyncFlush() System.Windows.Media.MediaContext.CompleteRender() System.Windows.Interop.HwndTarget.OnResize() System.Windows.Interop.HwndTarget.HandleMessage (MS.Internal.Interop.WindowMessage, IntPtr, IntPtr) System.Windows.Interop.HwndSource.HwndTargetFilterMessage (IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef) MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef) MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object) System.Windows.Threading.ExceptionWrapper.InternalRealCall (System.Delegate, System.Object, Int32) System.Windows.Threading.ExceptionWrapper.TryCatchWhen (System.Object, System.Delegate, System.Object, Int32, System.Delegate) System.Windows.Threading.Dispatcher.LegacyInvokeImpl (System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32) MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr) MS.Win32.UnsafeNativeMethods.CallWindowProc(IntPtr, IntPtr, Int32, IntPtr, IntPtr) MS.Win32.HwndSubclass.DefWndProcWrapper(IntPtr, Int32, IntPtr, IntPtr) MS.Win32.UnsafeNativeMethods.CallWindowProc(IntPtr, IntPtr, Int32, IntPtr, IntPtr) MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr) MS.Win32.UnsafeNativeMethods.SetWindowPos(System.Runtime.InteropServices.HandleRef, System.Runtime.InteropServices.HandleRef, Int32, Int32, Int32, Int32, Int32) System.Windows.Window.SetupInitialState(Double, Double, Double, Double) System.Windows.Window.CreateSourceWindow(Boolean) System.Windows.Window.CreateSourceWindowDuringShow() System.Windows.Window.SafeCreateWindowDuringShow() System.Windows.Window.ShowHelper(System.Object) System.Windows.Window.Show() Org.Bestinet.BV.Presentation.UI.BusyIndicatorHelper.ShowProgWindowCustomSize (Org.Bestinet.BV.Presentation.UI.WindowCustom) Org.Bestinet.BV.Presentation.UI.BusyIndicatorHelper+<> c__DisplayClass2.<ShowBusyIndicatorCustomSize>b__0() System.Threading.ThreadHelper.ThreadStart_Context(System.Object) System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) System.Threading.ThreadHelper.ThreadStart()
我怀疑问题出在VerifyFinger函数上,因为我们在这里检查指纹图像。
public void ShowBusyIndicatorCustomSize(string message, WindowCustom currentWindow, bool fileTransferStatus = false)
{
_message = message;
using (_progressWindowWaitHandle = new AutoResetEvent(false))
{
_transferLoadVisibility = fileTransferStatus;
//Starts the progress window thread
Thread newprogWindowThread = new Thread(() => ShowProgWindowCustomSize(currentWindow));
//new Thread(new ThreadStart(ShowProgWindowNew(height, width, left, right)));
newprogWindowThread.SetApartmentState(ApartmentState.STA);
newprogWindowThread.IsBackground = true;
newprogWindowThread.Start();
//Wait for thread to notify that it has created the window
_progressWindowWaitHandle.WaitOne();
_isActive = true;
}
}
这将调用ShowProgWindowCustomSize(currentWindow),如以下所示。
private void ShowProgWindowCustomSize(WindowCustom currentWindow)
{
if (_transferLoadVisibility)
{
//creates and shows the progress window
progWindow = new LoadingWindow(_message);
progWindow.Height = currentWindow.WindowHeight;
progWindow.Width = currentWindow.WindowWidth;
progWindow.Left = currentWindow.WindowLeft;
progWindow.Top = currentWindow.WindowTop;
progWindow.WindowState = currentWindow.WindowState;
progWindow.FileTansfer();
progWindow.Show();
}
else
{
//creates and shows the progress window
progWindow = new LoadingWindow(_message);
progWindow.Height = currentWindow.WindowHeight;
progWindow.Width = currentWindow.WindowWidth;
progWindow.Left = currentWindow.WindowLeft;
progWindow.Top = currentWindow.WindowTop;
progWindow.WindowState = currentWindow.WindowState;
progWindow.Show();
}
//makes sure dispatcher is shut down when the window is closed
progWindow.Closed += (s, e) => Dispatcher.CurrentDispatcher.BeginInvokeShutdown(DispatcherPriority.Background);
//Notifies command thread the window has been created
_progressWindowWaitHandle.Set();
//Starts window dispatcher
System.Windows.Threading.Dispatcher.Run();
}
以下是抛出outofmemory异常的情况。
应用程序: BioMedicalVerification.exe 框架版本: v4.0.30319 描述: 由于未处理的异常,进程已终止。 异常信息: System.OutOfMemoryException 堆栈: System.Windows.Media.Composition.DUCE+Channel.SyncFlush() System.Windows.Media.MediaContext.CompleteRender() System.Windows.Interop.HwndTarget.OnResize() System.Windows.Interop.HwndTarget.HandleMessage (MS.Internal.Interop.WindowMessage, IntPtr, IntPtr) System.Windows.Interop.HwndSource.HwndTargetFilterMessage (IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef) MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef) MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object) System.Windows.Threading.ExceptionWrapper.InternalRealCall (System.Delegate, System.Object, Int32) System.Windows.Threading.ExceptionWrapper.TryCatchWhen (System.Object, System.Delegate, System.Object, Int32, System.Delegate) System.Windows.Threading.Dispatcher.LegacyInvokeImpl (System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32) MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr) MS.Win32.UnsafeNativeMethods.CallWindowProc(IntPtr, IntPtr, Int32, IntPtr, IntPtr) MS.Win32.HwndSubclass.DefWndProcWrapper(IntPtr, Int32, IntPtr, IntPtr) MS.Win32.UnsafeNativeMethods.CallWindowProc(IntPtr, IntPtr, Int32, IntPtr, IntPtr) MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr) MS.Win32.UnsafeNativeMethods.SetWindowPos(System.Runtime.InteropServices.HandleRef, System.Runtime.InteropServices.HandleRef, Int32, Int32, Int32, Int32, Int32) System.Windows.Window.SetupInitialState(Double, Double, Double, Double) System.Windows.Window.CreateSourceWindow(Boolean) System.Windows.Window.CreateSourceWindowDuringShow() System.Windows.Window.SafeCreateWindowDuringShow() System.Windows.Window.ShowHelper(System.Object) System.Windows.Window.Show() Org.Bestinet.BV.Presentation.UI.BusyIndicatorHelper.ShowProgWindowCustomSize (Org.Bestinet.BV.Presentation.UI.WindowCustom) Org.Bestinet.BV.Presentation.UI.BusyIndicatorHelper+<> c__DisplayClass2.<ShowBusyIndicatorCustomSize>b__0() System.Threading.ThreadHelper.ThreadStart_Context(System.Object) System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) System.Threading.ThreadHelper.ThreadStart()
我怀疑问题出在VerifyFinger函数上,因为我们在这里检查指纹图像。
BusyIndicatorHelper busyIndicatorHelper = new BusyIndicatorHelper();
List<WorkerDO> docList = new
DatabaseHelper().SearchDocInfo(UserContext.VdrInfo.WorkerObj.WrkrId);
if (docList != null && docList.Count > 0)
{ busyIndicatorHelper.ShowBusyIndicatorCustomSize("Verification",
WindowSetting.GetCurrentWindowState(this));
FingerPrintHelper fp = null;
if (_fpHelper != null)
fp = _fpHelper;
else
fp = FingerPrintHelper.GetFingerPrinterHelperObj;
verifyStatus = fp.VerifyFinger(docList, _viewModel.DetectedFingers,
IsIndexFingerSelected);
docList = null;
_viewModel.DetectedFingers = null;
}