Kontrolle.Invoke() hängt die Anwendung
Zeige ich eine animation während meiner Steuerung ist das laden der Daten. Wenn der thread beendet ist, Verstecke ich die animation und zeigen Sie die Kontrolle. Also ich bin mit der Ausführung dieses code aus einem thread:
protected void InvokeEnableBackControl()
{
if (this.InvokeRequired)
{
this.Invoke(new OpHandler(EnableBackControl));
}
else
{
EnableBackControl();
}
}
Manchmal, wenn ich diesen code ausführen, der Haupt-thread wird erhängt im folgenden code:
protected virtual void EnableBackControl()
{
if (overlayAnimation.TargetControl != null)
{
overlayAnimation.TargetControl.BringToFront();
}
overlayAnimation.SendToBack();
overlayAnimation.Enabled = false;
overlayAnimation.Visible = false;
}
Ich bin mir nicht sicher, ob es gehängt Einstellung der Enable
oder Visible
Eigenschaft. Kennen Sie eine Umstand, dass kann die Anwendung aufrufen, diese Eigenschaften aus einer Control.Invoke
?
- Gibt es ein erkennbares Muster zu den Zeiten, wenn es hängt?
- nur "manchmal". Ärgerlich ist.
- Dokumentieren Sie die genauen Aussage hängt er sich auf, posten Sie den stack-trace.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beachten Sie, dass
Control.Invoke
ist synchron, so wird es warten, bisEnableBackControl()
zurück. Erwägen Sie die VerwendungControl.BeginInvoke
, was Sie können "Feuer-und-vergessen".Siehe diese Antwort: Was ist der Unterschied zwischen der Invoke () - und BeginInvoke()
Habe ich Probleme vor, wenn ich ' m ausgeführt .Aufrufen auf einem hintergrund-thread während meiner Haupt-thread ist immer noch beschäftigt - dies gibt den Eindruck, dass die app abgestürzt ist, weil die .Aufrufen sitzt nur da, wartet der Haupt-thread zu reagieren, dass es die Aufmerksamkeit. Mögliche Ursachen:
Wenn Sie den debugger, pay Besondere Aufmerksamkeit, was Ihre Haupt-MessagePump thread zu tun - ich vermute, die mangelnde Aufmerksamkeit ist die Ursache Ihrer Schwierigkeiten. Wenn Sie feststellen, dass es eine enge Schleife in der main-thread nicht mehr reagiert, versuchen Sie eine
.DoEvents
in der Schleife, die Ausführung anhalten und Kraft der Haupt-thread zu leeren, das Nachrichtensystem und die route, die alle ausstehenden Anforderungen.Run in debug, machen die app hängen und dann eine pause machen, in Visual Studio Debuggen und inspizieren threads.
overlayAnimation.Visible = false;
aber in der Regel Visual Studio (fast 2003) hält in der vorherigen Zeile. Nur manchmal, das ist der Grund, ich bin nicht sicher, wenn die Linie oder die Vorherige.Was ich entdeckt habe ist, dass der eigentliche Zeichnung/Malerei von Steuerelementen kann sehr langsam sein, besonders wenn Sie haben eine Menge von Ihnen und/oder verwenden Sie die doppelte Pufferung für eine reibungslose aktualisieren. Ich war mit BeginInvoke zum aktualisieren einer listview-Steuerelement aus den Daten, die ich empfangen wurde von einem socket. In Zeiten der updates geschahen so schnell, dass es war das einfrieren der app. Ich löste dies durch das schreiben alles, was ich erhielt in den buchsen asynchrone empfangen, die an eine Warteschlange, und dann in einem separaten thread abarbeiten der Warteschlange die Daten und die Nutzung BeginUpdate und EndUpdate auf das listview-und das tun alle ausstehenden updates dazwischen. Diese schneiden Sie aus eine Tonne von extra-festigen und aus der app eine Menge mehr reagiert.
Verwenden Sie
BeginInvoke
inestedInvoke
sehen diese Link