Saturday, 14 October 2017

Leistungsindikator C # Process Waitforexit


Verwenden von Leistungsindikatoren in der C-Sprache Zu einem beliebigen Zeitpunkt verfolgt das Windows-Betriebssystem Statistiken für das System und viele der Prozessanwendungen, die derzeit auf ihr ausgeführt werden. Dinge wie die Anzahl der Prozessoren, wie viele Threads ausgeführt werden, wie oft die CLR ist in Garbage Collection, die Anzahl der IO-Operationen durchgeführt usw. werden alle durch Dinge namens Leistungsindikatoren verfolgt. Eine Möglichkeit, die Sie diese verschiedenen Zähler betrachten können, ist, sie durch die Performance Monitor program8230 auch als perfmon. exe bekannt betrachten. Wenn Sie auf die Schaltfläche Start (in Windows 7 oder ähnliche Versionen von Windows) und im Feld Ausführen von 8220perfmon. exe8221 gehen, sollten Sie Systemmonitor anzeigen. Dort können Sie die verschiedenen Zähler erkunden, die Ihnen zur Verfügung stehen. Die Struktur der Leistungsindikatoren und Kategorien In vielen Texten, die Sie gelesen haben, können Sie das System immer als eine Liste von Kategorien (wie System, Server, Prozessor, NET CLR-Speicher usw.) und innerhalb dieser Kategorien haben Sie ähnliche Zähler gruppiert zusammen. Zum Beispiel, in der Processor-Kategorie würden Sie haben Zähler im Zusammenhang mit Informationen über Ihre CPU und ihre Kerne. Eine Sache finde ich die meisten Texte don8217t tun ist eine direkte Beziehung mit der Idee von 8220instances8221 zu erklären. Um 8220most8221 Zähler zu lesen, müssen Sie eine Instanz für eine gegebene Kategorie haben. Anstatt also eine Kategorie, ein Zähler und dann mehrere Instanzen zu sein, ist es mehr wie die Kategorie, null oder mehr Instanzen, für die die Zähler dieser Kategorie angewendet werden können. Dies bedeutet, dass eine Zählerkategorie Zähler haben kann, die, wenn keine Instanzen für diesen Typ von Kategorie existieren, zu einem gegebenen Zeitpunkt relativ unbrauchbar sind. Als Beispiel nehmen let8217s die Performance-Kategorie CLR-Speicher. Diese Kategorie enthält Zähler, die sich auf Anwendungen und ihre CLR-Speicherstatistik beziehen. Wenn ich meine Testanwendung laufe, würde ich eine Instanz des Exe-Popups in dieser CLR-Speicherkategorie sehen. Ich könnte dann in der Lage sein, Zähler darauf anzuwenden, um zu sehen, wie viel Zeit es verbringt Müllsammeln Objekte, die Anzahl der Griffe verwendet, die Anzahl der Gen 0 Sammlungen usw. Aber wenn ich didn8217t haben alle Instanzen ausgeführt werden, würde diese Kategorie nicht sein Viel Einsatz. Ich wouldn8217t eine Instanz, um Zähler anwenden. Kategorien wie Prozessor sollte immer Instanzen haben, weil es für Ihre CPU, die Sie sicherlich eine oder mehrere der gelten. Wenn Sie einen Quadcore-Computer ausführen, würden Sie sehen, 4 Instanzen gibt, jeder hat den gleichen Satz von Zählern auf sie angewendet werden. Der Grund, warum ich erkläre, ist, dass in unserem Code unten müssen wir für Instanzen zu überprüfen, bevor wir versuchen, einige Zähler zu lesen. Andernfalls können wir in Schwierigkeiten geraten, dass wir versuchen, die Leistung einer Instanz, die überhaupt nicht irgendetwas durchzuführen, zu lesen. Warum sollten wir Leistungsindikatoren benötigen Die Informationen, die in einem dieser Zähler gebunden sind, können uns einen Einblick in unsere Anwendungen und das System geben, für das Ihr Programm läuft. Wir könnten überprüfen, ob es genügend verfügbaren Speicher, könnten wir überprüfen, ob der Computer mit mehreren CPU-Kerne, können wir sagen, wenn vielleicht unsere App ist mit zu viel Ressourcen und kostenlos einige Dinge etc. Mit diesen Zähler können wir die allgemeine Gesundheit abzählen Unserer Anwendung und des Systems als Ganzes. Und bevor Sie fragen, können Sie diese Art von Informationen mit anderen Mitteln wie dem WMI-System (Windows Management Instrumentation) oder durch einheimische Objekte erreichen. Allerdings Zähler kann ein Mechanismus für die Messung der aktuellen Runtime Statistiken und erreichen viele Dinge, die entweder unmöglich oder schwerer zu lesen, mit anderen Methoden sein kann. Lesen eines Zählers mithilfe von C Bevor Sie mit unserem Code beginnen, öffnen Sie den Systemmonitor jetzt und durchsuchen Sie die verschiedenen Kategorien und Zähler. Für unseren Code werden wir wählen, eine einfache, die Ihnen zeigen, wie die Dinge funktionieren. Unser Beispiel liest 8220Bytes Receivedsec8221 unserer aktiven Netzwerkschnittstellenverbindung (NIC). Wir werden es aufstellen, um die NIC für unsere stat jede Sekunde für zwanzig Sekunden abzurufen. Da unsere Verbindungen in der Regel immer irgendeine Art von Informationen in diesen Tagen erhalten, sollten Sie Zahlen fast sofort sehen. Wenn nicht, können Sie nur einen Browser öffnen, während dies läuft und surfen auf eine Website, um dann zu sehen beginnen die Zahlen ändern. Zum Lesen von Leistungsindikatoren gehört die Verwendung der PerformanceCounter-Klasse, die Sie im System. Diagnostics-Namespace finden können. Es nimmt die Kategorie, den Zähler-Namen und optional eine Instanz. In unserem Beispiel spezifizieren wir die Kategorie Netzwerkschnittstelle, wir wollen die Anzahl der Bytes Receivedsec der aktiven NIC8230-Instanz sehen. Um einen Wert aus dem Zähler zu ziehen, verwenden wir die NextValue () - Methode und drucken sie in das Konsolenfenster, damit wir sehen können, was angezeigt wird. Dann schlafen wir für eine Sekunde und gehen zur nächsten Lesung zurück. Diese besondere Methode isn8217t ideal, da, wenn Sie dies in einer Form fallen, da Sie am Ende blockieren würde Ihre Haupt-Thread für 20 Sekunden, aber es ist toll, wie eine einfache Erklärung. Aus dieser Struktur können Sie sehen, dass diese Zähler gemacht werden, immer und immer wieder abgefragt werden, um Dinge wie ein Diagramm zu machen, weshalb Sie sehen, ein solches Diagramm in Performance-Monitor. Mischen Sie diese Idee mit etwas wie einem Monitoring-Hintergrund-Thread und Sie haben ein Setup für das Lesen von statistischen Daten, während der Benutzer etwas anderes macht. Erstellen von Zähler und Schreiben von Daten an Sie Vielleicht haben Sie Ihre eigenen Statistiken, die Sie zu einem bestimmten Zeitpunkt für Ihre Anwendung zu halten. Sie können solche Zähler programmgesteuert selbst erstellen, indem Sie die CounterCreationDataCollection verwenden. Hier fügen wir neue Zähler hinzu, indem wir eine Instanz von CounterCreationData () erstellen, die den Zählernamen, die Hilfeinformation und den zugrundeliegenden Zählertyp angibt (wie zB NumberOfItems32). Sobald wir alle unsere Zähler der Sammlung hinzugefügt haben, übergeben wir den Kategorienamen und die Sammlung zur PerformanceCounterCategory. Create () - Methode, um sie zu erstellen. Hinweis: Möglicherweise benötigen Sie an dieser Stelle Administratorrechte, um die Kategorie hinzuzufügen. Normalerweise möchten Sie nicht Ihre eigene Kategorie hinzufügen, es sei denn Sie waren anfänglich ein Programm einrichten. An dieser Stelle würden Sie die entsprechenden Berechtigungen erhalten und dann die Zähler erstellen. Ich finde, dass die meiste Zeit alles, was ich jemals wirklich tun müssen, ist vorhandene Zähler zu lesen. Aus unserem Code oben können Sie sehen, wie die Schritte von der Überprüfung, ob die Kategorie bereits vorhanden ist, bis zur Erstellung der Kategorie. Wenn eine Kategorie vorhanden ist, müssen Sie die Kategorie zuerst löschen, bevor Sie sie erneut erstellen können (mit der Methode PerformanceCounterCategory. Delete). So kann der Code oben auch eine Art von else-Anweisung enthalten, die die Kategorie vor dem Erstellen der Auflistung löschen kann. Schließlich Manipulieren Sie Ihr erstellt Zähler Dieser Teil ist ziemlich einfach. Sobald Sie Ihre benutzerdefinierten Zähler erstellt haben, müssen Sie nur die PerformanceCounter-Klasse erneut verwenden, um den Zähler zu lesen, aber seine 8220ReadOnly8221 - Eigenschaft auf false festgelegt, so dass Sie seine. RawValue - Eigenschaft auf einen Wert setzen können. Sie können den Wert auch erhöhen, indem Sie Methoden wie Increment () oder IncrementBy () verwenden, um diese um einen bestimmten Betrag zu erhöhen. Wieder, stellen Sie sicher, dass Sie die richtigen Admin-Berechtigungen zuerst haben, wenn Sie in eine Wand hier laufen. Einige Gotchas zu vermeiden Beim Spielen mit Zählern können Sie in ein paar seltsame Probleme laufen und ich wollte nur sicherstellen, dass Sie bewusst waren. Eine der ersten, die Sie ausführen können, ist das Lesen eines bestimmten Zählers. Zunächst kann der Zähler zunächst Null erreichen. Dies liegt daran, dass die Zähler auf der Grundlage eines vorherigen Wertes basieren, um seinen aktuellen Wert zu berechnen. Da auf dem ersten Sample kein vorheriger Wert vorhanden ist, kommt er auf Null. Der nächste Wert Pull sollte dann mit einem Wert beginnen. Ein weiterer gotcha, die wir kurz berührte, war, dass, um zu lesen und zu manipulieren einige Zähler werden Sie zu haben, um admin Privilegien haben. Ich fand das wirklich nur ins Spiel kam, wenn es um die Erstellung von Counter Kategorien kam. In der Regel zu einem der Werte, die Sie don8217t laufen in irgendwelche Probleme zu lesen. Wenn Sie Probleme beim Lesen einer Kategorie oder eines Zählers haben, stellen Sie sicher, dass Sie alles richtig und richtig Großschreibung schreiben. Die Namen können ein bisschen schwierig sein und stellen Sie sicher, dass alles genau ist. Verwenden Sie Performance-Monitor zu helfen, die Kategorie-Namen und Zähler richtig, so dass Sie nicht schlagen Ihren Kopf gegen die Wand mit diesem. Last gotcha, während die Aufzählung der Liste der Kategorien und Zähler, vorsichtig sein. Einige der Listen können wirklich lang und nehmen eine lange Zeit, um aufzulisten. Wir reden über einige der Kategorien, in denen Tausende von statistischen Datenzeilen aufgeführt sind. Wenn etwas für ein paar Sekunden eingefroren zu sein scheint, sei geduldig. Ich wünsche Ihnen viel Spaß beim Arbeiten mit den Leistungsindikatoren und dass Sie diese Informationen in Ihrem nächsten Projekt nutzen können. Lassen Sie uns alle wissen, was Sie Leistungsindikatoren für in unseren Kommentaren unten verwendet haben, so dass wir alle in der Herrlichkeit Ihrer 8220leetness8221 bask sind. Dank für das Lesen Über den Autor Martyr2 ist der Gründer des Coders Lexikon und Autor des neuen ebooks The Programmers Idea Buch und Diagnose des Problems. Er ist ein Programmierer seit über 18 Jahren. Er arbeitet für eine Hot Application Development Company in Vancouver Kanada, die einige der größten Telekommunikationsunternehmen der Welt bedient. Er hat zahlreiche Auszeichnungen für sein Mentoring in der Softwareentwicklung gewonnen und trägt regelmäßig zu mehreren Communities rund ums Web bei. Er ist ein Experte in zahlreichen Sprachen, einschließlich, PHP, CC, Java und vieles mehr. Verwandte Beiträge Diese Frage scheint ein wenig seltsam, aber ich versuche, VS2005 durch einen Prozess ausführen und führen Sie einen bestimmten Befehl und ich waitforexit (). Ich bin umgeleitet meine Eingabe und Ausgabe erfolgreich, aber hin und wieder habe ich zufällig eine Window Error Reporting WindowMessage erhalten. Das Problem ist, dass ich remoting bin, also wenn dieses Meldungsfenster während der Prozessausführung auftritt, werde ich hängen, es sei denn, ich log in die andere (Remoting) Maschine und schließen Sie das Fenster. Gibt es eine Möglichkeit, programmgesteuert zu töten dieses Fenster oder möglicherweise deaktivieren Sie das Message-Fenster von auftretenden Ich habe gedacht, VS laufen in einer leisen Ausführung (Ich habe noch einen Weg, dies zu tun). Ich habe auch versucht, um zu sehen, wenn es irgendetwas lachte, wenn dies geschieht, vergleichen, wenn es nicht. Donnerstag, 25. Oktober 2007 20:32 Nun, ich habe versucht, FindWindow und FindWindowEx zusammen mit SendMessage zu verwenden, aber ich konnte das richtige Fensterhandle nicht finden. Aber da ich weiß, dass eine Windows-Fehlermeldung Msssage-Box wird auftauchen, überprüfte ich, um zu sehen, ob es sein eigener Prozess (und es ist). Der Prozess ist dwwin. exe (Dr. Watson Win) und alles, was ich tun musste, war dies, damit ich das aktuelle Problem richtig zu bekommen. Ersetzen Sie den aktuellen Codeblock unten für die WaitForExit () - Anweisung, die ich zuvor hatte. Proc. WaitForExit (60000) eine Minute Prozess ProcArray Process. GetProcessesByName (quotdwwinquot) foreach (Prozess ProcessGound in ProcArray) Ich überprüfte auch, um zu sehen, wenn Sie in der Lage, die Process. MainWindowTitle () erhalten, aber es ist auf quotquot gesetzt. Also das ist ein Hack und ich mag es nicht, aber es funktioniert für die aktuelle Ausführung. Nein, ich kann die Eingabe und Ausgabe ohne Probleme umleiten. Der Fehler, den ich empfange, ist die allgemeine Windows-Fehlermeldung und leider ist es in Japanisch, so weiß ich nicht, was der genaue Fehler ist, aber es ist der allgemeine Fehler. Ich habe nicht den Code vor mir, aber ich eingerichtet delegatesthreads zu lesen umgeleitet den Fehler und die Ausgabe, nachdem ich den gesamten Prozess beenden. Ich kann nicht kommen mit irgendetwas und ich bin in der Lage, den gleichen Prozess auf meinem eigenen Computer laufen, aber ich bin nicht in der Lage, dies zu tun, einen bestimmten Befehl durch remoting. Ich werde versuchen, es morgen Remoting auf einem nicht-japanischen Maschine bei der Arbeit, und ich werde meine Erkenntnisse unabhängig. Freitag, 26. Oktober 2007 02:34 Sind Sie mit der Konsole quotcmdquot. Wenn ja, dann müssen Sie auch exit eingeben. Wenn Sie eine Vorstellung davon, wie viel Zeit Ihr Prozess zu nehmen, dann können Sie bool beendet process. WaitForExit (timeInMilliSeconds) verwenden, wenn (beendet) Prozess beendet vor Timeout-Zeitraum. Sonst Fehlermeldung drucken Dies kann nicht mit dem, was Sie tun, verwandt werden, aber ich hatte eine Erfahrung, wo der Prozess nicht beenden würde, wenn ich seine Ausgabe umgeleitet. Versuchen Sie, die Ausgabeumleitung zu deaktivieren und sehen Sie, ob der Prozess beendet wird. Probieren Sie es aus, es könnte funktionieren. Freitag, 26. Oktober 2007 11:58 Ich möchte das versuchen, aber es ist zu viel von einem Hack. Ich habe zu viele verschiedene Befehle, die verschiedene Mengen an Zeit (30 Sekunden bis 25 Minuten) nehmen, so gibt es keine Echtzeit-Einstellung, die ich ohne Zerstörung meiner Leistung Platz könnte. Diese Funktion hat in den letzten 6 Monaten für mehrere Befehle korrekt funktioniert und nun entscheidet sie sich für mich. Ich versuchte es auf einem anderen Computer ohne Probleme (das ist wirklich messing mit mir). Ich weiß, dass es nicht die Outputerror-Umleitung, weil ein neues WINDOW wird auf dem Server erstellt, dass ich bin Remoting. Sobald ich dieses Fenster schließe, verlässt mein Prozeß wie erwartet und die korrekte Ausgabe wird auf der Benutzerseite angezeigt. Vielen Dank für Ihre Hilfe, aber ich bin wirklich frustriert mit diesem Problem. Freitag, 26. Oktober 2007 um 15:01 Ohne zu wissen, die Details der Nachricht waren nur raten das Problem. Haben Sie installiert 3.5 Beta oder Visual Studio 2008 Beta überhaupt Wie verwenden Sie Process, um das Programm zu starten, Process. Start (quotfile. exequot) oder verwenden Sie ProcessStartInfo Freitag, 26. Oktober 2007 15.21 Uhr Nein, habe ich 2003 und 2005 installiert. Proc new Prozess () procSI new ProcessStartInfo () Ich setze dann einen neuen Thread für sowohl den StandardError als auch den StandardOutput ein und schreibe dann meine Befehle und if (Umleitung von standard out) Start thread für st. Out If (Umleiten des Standardfehlers) Start thread für st. Fehler Proc. WaitForExit () lt -------- Dies ist, wo das Generic Windows Error Reporting Fenster auftritt. Ich übersetzte, was ich konnte aus dem Fenster, das auftaucht. Microsoft Visual Studio 2005 Da Problem auftritt, beendet es Microsoft Visual Studio 2005. Wir verwenden Unannehmlichkeiten, gibt es keine Entschuldigung. Nochmals vielen Dank für die ganze Zeit. Ich habe die StreamWriter sIn vor dem Erstellen der proc Process-Objekt. Ich dann umleiten die Eingabe nach dem proc. Start () - Befehl, also wie kann ich nicht besitzen dieses Ungeachtet, kann ich die Änderung der sIn. Close () auf nach dem Aufruf von WaitForExit zu sehen, ob dies alle Änderungen zu verschieben. Das Proc war ein Typ, sollte es proc. Auch hier handelt es sich nicht um eine Fehlermeldung, daher gibt es keine Stack-Trace. Meine StandardError-Umleitung ist leer und die Standard-OUtput-Umleitung enthält, was ich erwartet hatte, aber nichts auf einen Fehler aufgetreten. Dies ist, warum alles noch funktioniert, nachdem ich das Fenster Windows Error Reporting schließen. Ich werde nach, was passiert, nachdem ich die sIn. Close () Zeile unterhalb der WaitForExit () Zeile. Freitag, 26. Oktober 2007 16:59 Peter Ritchie hat geschrieben: Sie möchten nicht das sIn Objekt schließen, bis die Anwendung beendet hat, wenn youre Umleitung. Man sollte nicht schließen alle diese Streams überhaupt. Das Process-Objekt besitzt sie und es ist diejenige, die für die Reinigung nach sich selbst verantwortlich ist. Am besten sollte man Process. Dispose () nach Abschluss des Process-Objekts aufrufen. Sie sicherlich nicht brauchen (z. B. seine redundante), aber es sollte nicht ein Problem verursachen, nachdem der Prozess beendet hat. Process. Close ist die empfohlene Methode zum Schließen der Standardinput - und Standardoutput - (und Standarderror-) Ströme. Ich würde überrascht sein, wenn die Dispose-Methode nicht aufgerufen Close, zumindest als Teil seiner Operation. Ich würde es mit der Tatsache begünstigen, dass, da Process implementiert IDisposable (indirekt durch Erweiterung Komponente, die es implementiert), sollte man auf Dispose aufrufen und lassen, dass die richtige Aufräumarbeiten. Ich würde nicht empfehlen aufrufen Process. Close statt, noch zusätzlich zu, Process. Dispose. Ja, Anrufe verwerfen Schließen. Meine erste Empfehlung ist, einen verwendenden Block zu verwenden, meine zweite ist, Close aufzurufen, wenn Sie wissen, wann Sie damit fertig sind. In Objekten, die eine quotClosequot-Methode implementieren, obwohl sie IDisposable ist, ist es viel klarer, die "Closequot-Methode" zu verwenden. Plus, ohne einen Benutzungsblock zu verwenden, haben Sie keine Möglichkeit, die Variable und den Aufruf zu Dispose zu scopieren - das Objekt könnte nach dem Aufruf von Dispose verwendet werden. Wenn Sie Close youve verwenden, werden alle verwalteten Ressourcen entfernt, aber das Objekt kann weiterhin verwendet werden (dh es wurde nicht als quotdisposedquot markiert und Sie können es verwenden, um eine andere Anwendung auszuführen, ohne ein neues Process-Objekt zuzuweisen, das sonst eine ObjectDisposedException auslöst ). Also, wenn die erste Empfehlung ist es, einen verwendenden Block zu verwenden, dann wäre die nächste am besten zu rufen Dispose. Nicht Schließen, wenn, wie Sie gesagt haben, Sie wissen, dass Sie mit dem Objekt getan. Durch nur Aufruf von Close auf etwas, das IDisposable implementiert, ist der Entwickler möglicherweise einen Fehler machen. Wenn Dispose einige zusätzliche Bereinigungen, die über Delegieren hinausgehen, nicht zu schließen, dann wird der Programmierer sich für einen Fehler, indem Sie einfach aufrufen Close. Es kann ein Fall für den Aufruf von Close geben, aber nur, wenn Sie nicht mit dem Objekt fertig sind, wie Sie am unteren Ende Ihrer letzten Antwort angegeben haben. Aber wenn Sie damit fertig sind, rufen Sie Dispose. So, wenn die erste Empfehlung ist, einen verwendenden Block zu verwenden, dann wäre die nächste am besten zu rufen Dispose. Nicht Schließen, wenn, wie Sie gesagt haben, Sie wissen, dass Sie mit dem Objekt getan. Durch nur Aufruf von Close auf etwas, das IDisposable implementiert, ist der Entwickler möglicherweise einen Fehler machen. Wenn Dispose einige zusätzliche Bereinigungen, die über Delegieren hinausgehen, nicht zu schließen, dann wird der Programmierer sich für einen Fehler, indem Sie einfach aufrufen Close. Es kann ein Fall für den Aufruf von Close geben, aber nur, wenn Sie nicht mit dem Objekt fertig sind, wie Sie am unteren Ende Ihrer letzten Antwort angegeben haben. Aber wenn Sie damit fertig sind, rufen Sie Dispose. Tatsächlich ist seine QuoteQuote gleichbedeutend mit: DisposableClass obj neu DisposableClass () IDisposable Einweg-obj als IDisposable wenn (Einweg-Null) Aber ja, das ist, was eine verwendende Anweisung funktional gleichbedeutend ist, aber ich stimme nicht explizit aufrufen Dispose in Anwesenheit einer quotClosequot-Methode sollte Die erste Wahl wegen der fehlenden Scoping mit dem Dispose-Aufruf sein. Ich habe den Dienst ausgeführt, aber ich hielt es an, weil es für 2 Stunden lief und hatte es nie der Breakpoint, dass es innerhalb von 10 Minuten von mir angefangen haben sollte meine Klient. Ich habe die sIn. Close () - Linie gerade erst kommentiert und den Service neu gestartet und der Client und alles funktioniert wie vorher. Ich kann den Haltepunkt nach der WaitForExit () und ich fertig, mit der Windows-Fehlermeldung Meldung noch (wie es vorher war). Also, in meinem Fall, ich muss den Input-Stream zu schließen, um den Prozess wie erwartet beenden. Gibt es irgendwelche anderen Ideen, die ich die sIn. Close () Linie empfehlen kann, wenn Sie etwas überprüfen möchten. Freitag, 26. Oktober 2007 19:19 Anthony Maimone hat geschrieben: Ich hatte den Dienst ausgeführt, aber ich hielt es, weil es für 2 Stunden lief und hatte es nie der Breakpoint, dass es innerhalb von 10 Minuten von mir begann mein Client getroffen haben sollte . Ich habe die sIn. Close () - Linie gerade erst kommentiert und den Service neu gestartet und der Client und alles funktioniert wie vorher. Ich kann den Haltepunkt nach dem WaitForExit () treffen und ich vervollständige, mit der Windows-Fehlermeldung-Nachricht immer noch (wie es vorher war). Also, in meinem Fall, ich muss den Input-Stream zu schließen, um den Prozess wie erwartet beenden. Gibt es irgendwelche anderen Ideen, die ich die sIn. Close () Linie empfehlen kann, wenn Sie etwas überprüfen möchten. Es wäre hilfreich, die Ausnahmedetails zu sehen, wenn Sie den Fehler erhalten (wie der Aufruf-Stack). Wie verwenden Sie die Standardeingabe und die Standardausgabe Verwenden Sie alle ReadLine-Methoden Peter, mein Punkt ist: Wenn Sie nicht Dispose auf einem Objekt, das (direkt oder indirekt) IDisposable implementiert, dann youre nur fragen, für einen Bug. Ich möchte nicht auf diesem endlos aber argumentieren. Sie können weiterhin tun, wie Sie es tun, und ich bleibe bei mir. Solange wir nicht haben, um jeden anderen Code, Geldbuße zu halten. Und übrigens, ein quotusingquot Block schützt Sie auch nicht. Nichts hindert Sie daran, die Variable außerhalb des Blocks zu deklarieren (wenn ich mich richtig erinnere), so dass es noch im Bereich sein kann, nachdem der Block endet. Sie müssen sorgfältig schriftlich korrekten Code schreiben. Wenn Sie es in der quotusingquot-Anweisung erklären, das ist eine Möglichkeit. Aber mit dem Tryfinally-Ansatz zu entlassen, nur weil es die Variable im Umfang verlässt ist nicht wirklich der Punkt. Es muss immer noch Dispose () d irgendwo sein. Anthony Maimone hat geschrieben: Ich hatte den Dienst ausgeführt, aber ich hielt es, weil es für 2 Stunden lief und hatte es niemals den Breakpoint, dass es innerhalb von 10 Minuten getroffen haben sollte Ich beginne meinen Mandanten. Ich habe die sIn. Close () - Linie gerade erst kommentiert und den Service neu gestartet und der Client und alles funktioniert wie vorher. Ich kann den Haltepunkt nach dem WaitForExit () treffen und ich vervollständige, mit der Windows-Fehlermeldung-Nachricht immer noch (wie es vorher war). Also, in meinem Fall, ich muss den Input-Stream zu schließen, um den Prozess wie erwartet beenden. Gibt es irgendwelche anderen Ideen, die ich die sIn. Close () Linie empfehlen kann, wenn Sie etwas überprüfen möchten. Es wäre hilfreich, die Ausnahmedetails zu sehen, wenn Sie den Fehler erhalten (wie der Aufruf-Stack). Wie verwenden Sie die Standardeingabe und die Standardausgabe Verwenden Sie alle ReadLine-Methoden Wieder ist dies keine Ausnahme, die geworfen wird, so dass ich keine Ausnahme Details sehen. Ich gehe nicht direkt in den catch-Block in meinem Code, ich wieder DIRECTly nach dem Aufruf von WaitForExit (). Das Fenster, das ich empfange, ist das gleiche, das Sie erhalten, wenn jedes Microsoft-Produkt unerwartet schließt und MS Informationen über den Crash will. So, es gibt keine Ausnahme Details. Jedoch in einem der Systemprotokolle empfange ich eine Mesage (übersetzt aus Japanisch) quotDevenv. exe Anwendung erros auftreten, 8.0.50727.762 Version der Fehler aufgetreten msvcr80.dll-Modul, Version 8.0.50727.762, Fehler aufgetreten Adresse 0x00039001. Für weitere Informationen, go. microsoftfwlinkevents. asp das Helo und Support Center bitte refer. quot Ich bin Umleitung der Standard-Eingabe, um in den verschiedenen Befehle in, weil ich hatte Probleme mit ihnen zu arbeiten, wie ich wollte Form der StartInfo. Ich bin die Umleitung der Ausgabe-und Fehler-Streams zu überprüfen, was sie in ihnen haben, nachdem der Prozess beendet hat. Dies wird mir erlauben, für alles, was ich möchte in jedem Stream, wenn wir fertig sind zu überprüfen. Ich auch nicht zulassen, entweder der Ausgang oder Fehler Umleitung Threads zu verbinden, bis nach dem Prozess hat den Aufruf von WaitForExit übergeben. Ich bin völlig verstopft. Freitag, 26. Oktober 2007 19:53 Peter, mein Punkt ist: Wenn Sie nicht aufrufen Dispose auf ein Objekt, das (direkt oder indirekt) IDisposable implementiert, dann youre nur fragen, für einen Bug. Ich möchte nicht auf diesem endlos aber argumentieren. Sie können weiterhin tun, wie Sie es tun, und ich bleibe bei mir. Solange wir nicht haben, um jeden anderen Code, Geldbuße zu halten. Ich stimme nicht zu. Sein nicht ein quotbugquot, um nicht zu rufen Dispose. Ihre Ressourcen werden nicht sofort befreit, aber die GC wird sie freigeben, wenn sie den Speicher braucht (vorausgesetzt das Dispose-Muster ist ordnungsgemäß implementiert und ein Finalizer existiert). Wenn die Klasse youre mit implementiert eine quotClosequot - Methode, die nicht alle die gleichen Dinge wie quotDisposequot, Schließen sollte entweder als solche oder theres ein Fehler in der Klasse dokumentiert werden. Ive nie begegnet eine Framework-Klasse implementiert IDisposable und eine Close () - Methode, die eine quotleakquot eingeführt, wenn Close aufgerufen wurde, ohne Aufruf Dispose. Das überwältigende Muster für DisposeClose ist, dass Dispose calls Close sowie das Setzen eines quotdisposedquot-Flags (für das Werfen von ObjectDisposedException) verwendet wird. In der Tat ist dies in der Framework General Reference: "Gelegentlich ist ein Domain-spezifischer Name geeigneter als Dispose. Beispielsweise könnte eine Dateikapselung den Methodennamen Close verwenden. In diesem Fall implementieren Sie Dispose privat und erstellen eine öffentliche Close-Methode, die Dispose aufruft. Das folgende Codebeispiel veranschaulicht dieses Muster. Sie können Close durch einen Methodennamen ersetzen, der für Ihre domain. quot von der Implementierung von Finalize und dem Entsorgen von nicht verwalteten Ressourcen geeignet ist. Außerdem kann für bestimmte Klassen von Objekten wie Dateien oder Datenbankverbindungsobjekten eine Methode Close die logische Operation besser darstellen Sollte durchgeführt werden, wenn der Objekt-Verbraucher mit der object. quot aus der Verbesserung der Managed-Code-Performance beendet ist (obwohl es auch es auch Details in gut geschriebenen Fällen, beide funktional gleichwertig sind. quot es impliziert, dass mit Close ist klarer mit quotbetter representquot.) Und übrigens, ein quotusingquot Block schützt Sie auch nicht. Nichts hindert Sie daran, die Variable außerhalb des Blocks zu deklarieren (wenn ich mich richtig erinnere), so dass es noch im Bereich sein kann, nachdem der Block endet. Sie müssen sorgfältig schriftlich korrekten Code schreiben. Wenn Sie es in der quotusingquot-Anweisung erklären, das ist eine Möglichkeit. Aber mit dem Tryfinally-Ansatz zu entlassen, nur weil es die Variable im Umfang verlässt ist nicht wirklich der Punkt. Es muss immer noch Dispose () d irgendwo sein. Ja, theres alle Arten von Möglichkeiten, die Sie sich in den Fuß schießen können, aber das ist kein Szenario, das wir diskutiert haben. Ich würde persönlich schießen alle Code, den ich so überprüft. Das wäre auf meiner nicht empfohlenen Liste. Freitag, 26. Oktober 2007 19:54 Wieder ist dieses nicht eine Ausnahme, die geworfen wird, also sehe ich keine Ausnahmedetails. Ich gehe nicht direkt in den catch-Block in meinem Code, ich wieder DIRECTly nach dem Aufruf von WaitForExit (). Das Fenster, das ich empfange, ist das gleiche, das Sie erhalten, wenn jedes Microsoft-Produkt unerwartet schließt und MS Informationen über den Crash will. So, es gibt keine Ausnahme Details. Jedoch in einem der Systemprotokolle empfange ich eine Mesage (übersetzt aus Japanisch) quotDevenv. exe Anwendung erros auftreten, 8.0.50727.762 Version der Fehler aufgetreten msvcr80.dll-Modul, Version 8.0.50727.762, Fehler aufgetreten Adresse 0x00039001. Für weitere Informationen, go. microsoftfwlinkevents. asp das Helo und Support Center bitte refer. quot Ich nahm an, dass Ihre Anwendung die Nachricht generierte (in diesem Fall sollten Sie immer eine Ausnahme und eine Stapelüberwachung erhalten), war es nicht klar, dass Sie nach dem Aufruf fortsetzen Auf WaitForExit (). Es klingt für mich wie die Anwendung youre läuft ist abnormal beendet. Führen Sie devenv. exe Im nicht sicher, was Sie in Ihrer Anwendung tun können, um eine andere Anwendung beenden abnormal zu stoppen. Anthony Maimone schrieb: Ich bin die Umleitung der Standard-Eingang, um in den verschiedenen Befehle in, weil ich hatte Schwierigkeiten bekommen sie zu arbeiten, wie ich wollte Form der StartInfo. Ich bin die Umleitung der Ausgabe-und Fehler-Streams zu überprüfen, was sie in ihnen haben, nachdem der Prozess beendet hat. Dies wird mir erlauben, für alles, was ich möchte in jedem Stream, wenn wir fertig sind zu überprüfen. Ich auch nicht zulassen, entweder der Ausgang oder Fehler Umleitung Threads zu verbinden, bis nach dem Prozess hat den Aufruf von WaitForExit übergeben. Ich bin völlig verstopft. Sie können eine Deadlock, wenn Sie blockieren beim Lesen von und Anwendungen Standardausgabe - die unblock würde, wenn Sie den Stream geschlossen, ich glaube. Das einzige, was ich denken kann, ist die Erstellung einer Anwendung, die auf dem Server ausgeführt wird und überwachen Fenster, die Form der Prozesse, die Sie remote steuern und finden Sie die richtigen Schaltflächen und drücken Sie sie programmgesteuert eine Nachricht an die Nachricht Pumpe des Dialogfensters . Diese alos passiert mit Excel, Wort und andere Anwendungen, die mit Autimation verwendet werden können MSFT nicht entwerfen diese Anwendungen ohne Benutzerinteraktion ausgeführt werden so einmal in eine Weile erhalten Sie Fenster auf Fehler. Haben Sie darüber nachgedacht, mit MSBuid, die mehr geeignet für Batch-Builds ist, auch es scheint, dass in TFS 2008 Build-Server werden einfach zu bauen. Nun, ich versuchte, FindWindow und FindWindowEx zusammen mit SendMessage zu verwenden, aber ich konnte nicht das richtige Fensterhandle zu finden. Aber da ich weiß, dass eine Windows-Fehlermeldung Msssage-Box wird auftauchen, überprüfte ich, um zu sehen, ob es sein eigener Prozess (und es ist). Der Prozess ist dwwin. exe (Dr. Watson Win) und alles, was ich tun musste, war dies, damit ich das aktuelle Problem richtig zu bekommen. Ersetzen Sie den aktuellen Codeblock unten für die WaitForExit () - Anweisung, die ich zuvor hatte. Proc. WaitForExit (60000) eine Minute Prozess ProcArray Process. GetProcessesByName (quotdwwinquot) foreach (Prozess ProcessGound in ProcArray) Ich habe auch überprüft, um zu sehen, wenn Sie in der Lage, die Process. MainWindowTitle () erhalten, aber es ist auf quotquot gesetzt. Also das ist ein Hack und ich mag es nicht, aber es funktioniert für die aktuelle Ausführung. Montag, 29. Oktober 2007 19:26 Uhr

No comments:

Post a Comment