2010-12-15 8 views
1

Ich arbeite derzeit an einer Side-by-Side-Anwendung (C#, WinForms), die Nachrichten in eine Anwendung über COM einfügt.Out of proc COM Schwerfälligkeit

Diese Anwendung verwendet mehrere foreach-Anweisungen, Abfragen von Entitätsmetriken aus der Anwendung, die COM akzeptiert. Eine ListBox wird zum Auflisten jeder Entität verwendet. Wenn ein Benutzer eine Entität aus dieser Liste auswählt, wird ein Thread erstellt und ausgeführt, der eine Methode aufruft, die die erforderlichen Daten abruft.

Wenn ein Benutzer eine andere Entität aus der Liste auswählt, wird der laufende Thread abgebrochen und ein neuer Thread für die neu ausgewählte Entität erstellt.

Ich habe einen Tag damit verbracht, meinen Threading- und Speicherverbrauch zu untersuchen und bin zu dem Schluss gekommen, dass alles in Ordnung ist. Niemals werden mehr als 6 Threads gleichzeitig ausgeführt (alle für die Ausführung unterschiedlicher Member) und über den Windows Task-Manager erreicht meine Anwendung nie einen Spitzenwert von> 10 CPU%, 29M MEM.

Antwort

2

Das einzige, was Ihnen in den Sinn kommt, ist, dass das von Ihnen verwendete COM-Objekt für die Ausführung in einer Single-Thread-Wohnung (STA) ausgelegt ist. Wenn dies der Fall ist, spielt es keine Rolle, wie viele Threads Sie starten. Sie werden schließlich beim Aufruf dieses COM-Objekts serialisiert. Und wenn Ihre Maschine mehrere Kerne hat, werden Sie definitiv weniger als 100% Auslastung sehen. 10% scheint jedoch sehr niedrig. Ich wäre nicht überrascht, etwas um 25% zu sehen, was im Grunde genommen ein Kern eines Quad-Core-Systems wäre, aber die 10% -Figur könnte eine andere Erklärung erfordern. Wenn Ihr Code oder das COM-Objekt selbst darauf wartet, dass IO-Operationen abgeschlossen werden, kann dies den geringeren Durchsatz erklären.

0

Sie erwähnen nicht, was langsam ist, also ist es sehr schwierig, etwas mit Gewissheit zu sagen. Da Sie jedoch sagen, dass Sie Elemente in eine Listbox einfügen, werde ich eine komplette Schätzung machen und fragen, wie viele Elemente das jedes Mal ist? Es kann sehr langsam sein, viele Elemente in ein Listenfeld einzufügen.

Wenn dies der Fall ist, könnten Sie es beschleunigen, anstatt jede Entität in einer Listbox aufzulisten, nur eine Gruppe von Kategorien aufzulisten und dann, wenn der Benutzer eine Kategorie auswählt, eine andere Listbox mit den zugehörigen Entitäten zu füllen diese Kategorie.

+0

Danke für die Führung; Die ListBox enthält eine unbestimmte Anzahl von Entitäten. Im Allgemeinen enthält sie etwa 5-15. – wulfgarpro

+0

@wulfgarpro: Klingt wahrscheinlich dann egal. Allerdings, wenn Sie eine ganze Reihe von Steuerelementen die ganze Zeit aktualisieren, könnte die Antwort von Chad nützlich sein, um es zu versuchen. –

2

In WinForms können Sie SuspendLayout() und ResumeLayout() tun. Wenn Sie viele Elemente einfügen (oder im Allgemeinen viele Bildschirmaktualisierungen durchführen), rufen Sie zunächst SuspectLayout() auf, führen dann alle Ihre Aktualisierungen und dann ResumeLayout() aus.

+0

Dies könnte das Problem sein; Die Daten aktualisieren fortlaufend einen Satz von 8 Textfeldern in einem TabControl (die sich jeweils auf die über COM abgefragten Daten beziehen). Würdest du denken, dass dies auf das Geschwindigkeitsproblem zurückzuführen ist? – wulfgarpro

+0

@wulfgarpo - Ich nehme an, das trägt dazu bei und ich sehe nicht, wie es schaden könnte, das zu versuchen, um zu sehen, ob es hilft. Ich weiß jedoch nicht, ob das der Hauptgrund ist. – Chad

+0

hm, ich werde das ausprobieren (kann nicht von zuhause aus arbeiten). Ich werde auch die Anwendung profilieren und sehen, ob ich irgendwelche Engpaßschleifen finden kann. Ich halte dich auf dem laufenden! – wulfgarpro