Ich zeige eine Animation, während mein Steuerelement die Daten lädt. Wenn der Thread fertig ist, verstecke ich die Animation und zeige das Steuerelement an. Also führe ich diesen Code aus einem Thread aus:
%Vor%Manchmal, wenn ich diesen Code ausführe, wird der Haupt-Thread im folgenden Code gehängt:
%Vor%}
Ich bin mir nicht sicher, ob es gehängt wird, indem ich die Eigenschaft Enable
oder Visible
festlege. Kennen Sie Umstände, die die Anwendung, die diese Eigenschaften aufruft, möglicherweise von einem Control.Invoke
austeilen?
Beachten Sie, dass Control.Invoke
synchron ist, so dass auf EnableBackControl()
gewartet wird. Verwenden Sie Control.BeginInvoke
, das Sie "feuern und vergessen" können.
Siehe diese Antwort: Was ist der Unterschied zwischen Invoke ()? und BeginInvoke ()
Ich habe Probleme bei der Ausführung von .Invoke auf einem Hintergrund-Thread, während mein Haupt-Thread immer noch beschäftigt ist - das gibt den Eindruck, dass die App hängt, weil die .Invoke nur dort sitzt und auf die wartet Haupt-Thread um zu antworten, dass es aufpasst. Mögliche Ursachen:
Wenn Sie den Debugger anhängen, sollten Sie besonders darauf achten, was Ihr Haupt-MessagePump-Thread macht - ich vermute, dass der Mangel an Aufmerksamkeit die Ursache Ihres Problems ist. Wenn Sie feststellen, dass es in Ihrem Hauptthread eine enge Schleife gibt, die nicht reagiert, fügen Sie .DoEvents
in die Schleife ein, wodurch die Ausführung angehalten wird und der Hauptthread gezwungen wird, die Nachrichtenpumpe zu leeren und ausstehende Anforderungen weiterzuleiten.
Was ich entdeckt habe, ist, dass das eigentliche Zeichnen / Malen von Steuerelementen ziemlich langsam sein kann, besonders wenn Sie viele davon haben und / oder eine doppelte Pufferung für eine sanfte Aktualisierung verwenden. Ich habe BeginInvoke verwendet, um ein ListView-Steuerelement aus Daten zu aktualisieren, die ich von einem Socket empfangen habe. Manchmal waren die Updates so schnell, dass es die App einfror. Ich löste dies, indem ich alles, was ich in den Async-Sockets erhielt, in eine Warteschlange schrieb und dann in einem separaten Thread die Daten löschte und BeginUpdate und EndUpdate in der ListView und Doing verwendete alle ausstehenden Updates dazwischen. Dies schnitt eine Menge extra Nachzeichnen aus und machte die App viel ansprechender.
Tags und Links .net c# multithreading winforms