Frage

Ich benutze das ToolStripDropDown Um ein SelectionPopup zu zeigen.

Das ToolStripDropDown Enthält einige benutzerdefinierte Steuerelemente mit laufenden Threads. Die Fäden enden mit dem Ereignis von OnhandledEstroyed, aber aus irgendeinem Grund die ToolStripDropDown Entsorgt/zerstören Sie es nach dem Schließen nicht.

Entsorgen ToolStripDropDown Auf dem geschlossenen Ereignis gibt mir eine Ausnahme, da noch alles auf den ToolstripDropdown zugreift.

Woher weiß ich, ob die benutzerdefinierte Steuerung noch verwendet wird oder nicht, um den Thread zu beenden?

Zollkontrolle:

public class CControl : Control
{
    Thread StyleThread;
    Object lockOBJ = new Object();
    bool abortthread = false;

    public CControl()
    {
        this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer, true);
        this.SetStyle(ControlStyles.Selectable, false);

        StyleThread = new Thread(new ThreadStart(this.StyleDelegate));
    }


    protected override void OnHandleCreated(EventArgs e)
    {
        base.OnHandleCreated(e);
        if(!StyleThread.IsAlive)
            StyleThread.Start();
    }

    protected override void OnHandleDestroyed(EventArgs e)
    {
        base.OnHandleDestroyed(e);
        lock (lockOBJ)
        {
            abortthread = true;
        }
        if (StyleThread.IsAlive)
        {
            StyleThread.Join(100);
        }
    }

    ...
}

ToolstripDropdown-Kontroll:

public class AddPopUp : UserControl
{
    /*
        ------------------------------------
        This Control contains some CControls
        ------------------------------------
    */

    public void Show(Control control)
    {
        TSDD tsdd = new TSDD(this);
        Point screenpoint = control.PointToScreen(new Point(0, 0));
        tsdd.Show(control,new Point(0, -tsdd.Height ));
    }

    class TSDD : ToolStripDropDown
    {
        private Control Control { get; set; }

        public TSDD(Control control)
        {
            this.Control = control;
            this.DropShadowEnabled = false;
            ToolStripControlHost ch = new ToolStripControlHost(control);
            this.Items.Add(ch);
        }

        protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
        {
            base.SetBoundsCore(x, y, Control.Size.Width + 16, Control.Size.Height + 18, specified);
        }

        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams cp = base.CreateParams;
                unchecked
                {
                    cp.Style |= (int)0x80000000;
                    cp.Style |= 0x40000;
                }
                return cp;
            }
        }


        protected override void WndProc(ref Message m)
        {
            if (m.Msg == 0x84)
            {
                m.Result = (IntPtr)1;
                return;
            }
            base.WndProc(ref m);
        }
    }
}

BEARBEITEN:

Nach den gleichen weiteren Tests konnte ich den ToolstripDropdown nicht entsorgen. Als Problemumgehung zerstöre ich nur den Griff für die Schließung des ToolstripDropdowns.

        protected override void OnClosed(ToolStripDropDownClosedEventArgs e)
        {
            base.OnClosed(e);
            this.DestroyHandle();
        }
War es hilfreich?

Lösung

ToolStrips haben einen sehr hartnäckigen Fehler (behauptet, behauptet zu werden, aber ich habe immer noch Probleme), bei dem sie einen Ereignishandler bei SystemEvents registrieren.

Die einzige Problemumgehung, die ich gefunden habe, besteht darin, die angehängten ToolStrips durch Aufzählen der Handler in den Systemevents zu entfernen.

ToolStrip -Speicherleck

http://connect.microsoft.com/visualstudio/feedback/details/115600/toolstrip-leaks-after-calling-dispons##

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top