C# Dispose durch einen externen Thread?

roker002

Commander
Registriert
Dez. 2007
Beiträge
2.103
Ist es möglich, das wenn ich einen Steuerelement vorher dispose und daraufhin einen äquivalenten Steuerelement erzeuge, das der GC mir den neuen Steuerlement per externen Thread versucht zu killen?
 
Meinst du sowas?
Code:
Button b = new Button();
b.Dispose();
b = new Button(); // Der GC fasst diesen Button an?

Das kann eigentlich nicht sein, da es sich um zwei komplett unabhängige Objekte handelt und auf das zweite Objekt noch eine Referenz existiert.
Wie kommst du eigentlich darauf, dass der GC hier Einfluss hat?

Oder hab ich die Frage falsch verstanden? ;)
 
Ne, natürlich nicht, da du zuerst den button global eindeutig machen muss!

Dispose
Code:
        protected override void Dispose(bool disposing)
        {
            if (DisposeTable != null)//Mein Event, damit ich die anderen Elemente neupositioniere!
                DisposeTable(this, System.EventArgs.Empty);
            if (disposing && (components != null))
            {
                components.Dispose();
            }
            base.Dispose(disposing);
        }

Code:
        private void attainments2_Disposing(object sender, EventArgs e)
        {
            if (this.Disposing == true) //Wozu die neupositionierung wenn das hauptfenster geschloßen wird
                return;
            try
            {
                var local = sender as Attainments;
                this.MissingLP.Add(local.Tag);
                this.SuspendLayout();
                foreach (var item in this.AttainmentsList)
                {
                    if (item == null || item.Tag <= local.Tag)
                        continue;
                    else
                    {
                        int x = local.Location.X;
                        int y = item.Location.Y;
                        int h = local.Height;
                        item.Location = new Point(x, y - h); ///Hier bekomme ich immer Exception 
                        ///Dabei steht im item.InvokeRequired  auf TRUE.
                    }
                }
                this.ResumeLayout(true);
                this.AttainmentsList.Remove(local);
            }
            catch (Exception ex)
            { MessageBox.Show(ex.Message); }
        }

Auf jeden Fall wird von irgend einen anderen Thread ein Dispose auf bestimmte Elemente ausgeführt!

Hier wird ein neuer Attainment erzeugt!
Code:
        private void button2_Click(object sender, EventArgs e)
        {
            var item = (from n in AttainmentsList orderby n.Tag descending select n).First();
            Attainments newitem = null;
            if (MissingLP.Count == 0)
            {
                newitem = new Attainments(int.Parse(item.Tag.ToString()) + 1, new Point(item.Location.X, item.Location.Y + item.Height), this, DateTime.Now, 2);
            }
            else
            {
                newitem = new Attainments(this.MissingLP[0], new Point(item.Location.X, item.Location.Y + item.Height), this, DateTime.Now, 2);
                this.MissingLP.Remove(this.MissingLP[0]);
            }
            newitem.DisposeTable += new EventHandler(attainments2_Disposing);
            AttainmentsList.Add(newitem);
        }

Nach dem ich einen gelöscht habe springt beim erzeugen eine neues Elemten das ganze nach unten. Da passiert nix asyncrones.
Erzeuge ich noch einen Object, so springt einer der Attainments auf einmal in den Dispose! Eventuell passiert irgendwo eine Exception die nicht behandelt wird (aber dass sollte ja von vchost abgefangen werden oder?). Deswegen geht der vielleicht auf dispose? Aber wie gesagt, es passiert nix asyncrones!

Hm ich bin ratlos!

EDIT...

Es gibt einen Button auf dem Control, das den Dispose aufruft, wenn OK bestätigt wurde. Wenn ich aus Dispose Methode den Event rausnehme, und direkt vor dem aufruf Dispose(true); absetze, gibt es keinen Thread Exception mehr! Wow... das ist sehr merkwürdig. Aber es ging alles gut, letztendlich :D
 
Zuletzt bearbeitet:
Zurück
Oben