Ich verwende eine externe Bibliothek mit einer Eigenschaft, die sich entsprechend bestimmter Ereignisse ändert. Manchmal ändert sich der Wert schnell (nur in Schritten zwischen 1 und 2). Ich möchte einen Event-Handler erstellen, der erkennt, ob der Wert geändert wird, und wenn er sich ändert, den Wert als Teil einer Gleichung abrufen, um ein Formular an einen Punkt auf dem Bildschirm zu verschieben. Ich bin derzeit einen Timer:Ereignishandler für eine Eigenschaftswertänderung einer externen Bibliothek erstellen
private var foo;
public Form1()
{
this.InitializeComponent();
this.foo = new Foo();
this.DesktopLocation = new Point(foo.Property1 + 100, 500);
Timer timer = new Timer();
timer.Interval = 1;
timer.Tick += new EventHandler(this.Timer_Tick);
timer.Start();
}
private void Timer_Tick(object sender, EventArgs e)
{
this.DesktopLocation = new Point(this.foo.Property1 + 100, 500);
}
Was ich Trigger a custom event for an "external" value change basierte weg, aber ich hatte gehofft, für eine bessere Lösung, weil die Form hinter der vorgesehenen Stelle hinkt und flackert, wenn foo.Property1
mehrere Male in einer kurzen Zeitspanne ändert. Ich versuche, das Formular dem Punkt ähnlich zu folgen, wenn ein Benutzer das Formular mit der Maus bewegt. Vor dem Timer verwenden ich eine While-Schleife auf einem separaten Thread mit Rekursion:
private void CheckFoo()
{
while (!this.Created)
{
}
if (new Point(this.foo.Property1 + 100, 500) != this.DesktopLocation)
{
this.Invoke(new Action(() =>
{
this.DesktopLocation = new Point(this.foo.Property1 + 100, 500);
}));
}
while (this.DesktopLocation == new Point(this.foo.Property1 + 100, 500) && this.ContinueLoop)
{
}
if (this.ContinueLoop == false)
{
return;
}
else
{
this.CheckFoo();
}
}
Die obige Methode funktioniert visuell als etwa 30 Sekunden lang gedacht, aber dann stürzt es mit einem StackOverflowException
an verschiedenen Stellen im Code, in der Regel bei this.DesktopLocation = new Point(this.foo.Property1 + 100, 500);
aber manchmal anderswo (ich konnte den anderen Standort leider nicht replizieren). Ich lese über StackOverflowExceptions hier: https://www.dotnetperls.com/stackoverflowexception und es scheint, dass es ist, weil ich die Rekursionsschleife verwendete, also nehme ich an, dass ich die oben genannte Methode nicht verwenden kann. Gibt es einen Weg, dies ohne visuelle Probleme (oder Ausnahmen) zu erreichen?
Dies bezieht sich auf Ihre 3rd-Party-Klasse, Vererbung, Umhüllung, Erstellen von Proxy darauf oder irgendetwas anderes – AlirezaJ
@ AlirezaJ Ich verstehe nicht, bitte erarbeiten. Gab es eine Frage, die du verlinkt hast oder etwas? "Dies ist" schlägt eine Aussage vor, und das folgende 'bezogen auf 'schlägt vor, dass Sie beabsichtigten, eine Frage zu verbinden. – JordanZeotni