Click here to Skip to main content
15,889,883 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
The following code will call another thread when the application doing the processing to show the progress windows. It will throw an exception after we do multiple time, for example hit more than 50 times.
This is our code - BusyIndicatorHelper.ShowProgWindowCustomSize as thrown from the exception and will call the following code.
C#
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;
            }

        }

This will call ShowProgWindowCustomSize(currentWindow) as in the following.

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();
        }


Application: BioMedicalVerification.exe
Framework Version: v4.0.30319
Description: The process was terminated due to an unhandled exception.
Exception Info: System.OutOfMemoryException
Stack:
   at System.Windows.Media.Composition.DUCE+Channel.SyncFlush()
   at System.Windows.Media.MediaContext.CompleteRender()
   at System.Windows.Interop.HwndTarget.OnResize()
   at System.Windows.Interop.HwndTarget.HandleMessage(MS.Internal.Interop.WindowMessage, IntPtr, IntPtr)
   at System.Windows.Interop.HwndSource.HwndTargetFilterMessage(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   at MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
   at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
   at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr)
   at MS.Win32.UnsafeNativeMethods.CallWindowProc(IntPtr, IntPtr, Int32, IntPtr, IntPtr)
   at MS.Win32.HwndSubclass.DefWndProcWrapper(IntPtr, Int32, IntPtr, IntPtr)
   at MS.Win32.UnsafeNativeMethods.CallWindowProc(IntPtr, IntPtr, Int32, IntPtr, IntPtr)
   at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr)
   at MS.Win32.UnsafeNativeMethods.SetWindowPos(System.Runtime.InteropServices.HandleRef, System.Runtime.InteropServices.HandleRef, Int32, Int32, Int32, Int32, Int32)
   at System.Windows.Window.SetupInitialState(Double, Double, Double, Double)
   at System.Windows.Window.CreateSourceWindow(Boolean)
   at System.Windows.Window.CreateSourceWindowDuringShow()
   at System.Windows.Window.SafeCreateWindowDuringShow()
   at System.Windows.Window.ShowHelper(System.Object)
   at System.Windows.Window.Show()
   <big>at Org.Bestinet.BV.Presentation.UI.BusyIndicatorHelper.ShowProgWindowCustomSize(Org.Bestinet.BV.Presentation.UI.WindowCustom)
   at Org.Bestinet.BV.Presentation.UI.BusyIndicatorHelper+<>c__DisplayClass2.<ShowBusyIndicatorCustomSize>b__0()</big>
   at System.Threading.ThreadHelper.ThreadStart_Context(System.Object)
   at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
   at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
   at System.Threading.ThreadHelper.ThreadStart()
Posted
Updated 15-Jan-16 18:06pm
v2

1 solution

Based on the error stack I would check that you actually close the window at some point and the thread being called ends working. Based on the code you have provided, you show a new window on each thread call and from the stack you can see the the stack overflow happens exactly there, when the window is shown. So very likely the previously opened windows are still existing.
 
Share this answer
 
Comments
hash0077 15-Jan-16 2:02am    
Hi Mika. For your information, while doing processing i will call this new thread to show the progress animation. I will call this method busyIndicatorHelper.HideBusyIndicator() to close the to end the thread before close the window using this.close. Is the thread not close or dispose properly? thanks for the reply.
public void HideBusyIndicator()
{
//closes the Progress window
if(_isActive)
progWindow.Dispatcher.Invoke(new Action(progWindow.Close));
_isActive = false;
}

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900