Frage

Entsprechend der Dokumentation sollte WAITHANDLE in .NET explizit / implizit angeordnet sein.Ich habe jedoch Probleme, dies für die folgende grundlegende Synchronisationsaufgabe zu erreichen:

  • Eine zeitaufwendige Aufgabe wird auf einem Thread ausgeführt.
  • Der Hauptthread wartet darauf, dass die Aufgabe für einen vordefinierten Zeitraum abgeschlossen ist.Der Hauptfaden muss fortfahren, wenn a.Die Aufgabe ist abgeschlossen oder b.Das Timeout ist aufgetreten.

Hier mein Versuch, ein autoresetEvent-Objekt zu verwenden:

generasacodicetagpre.

Es gibt einen offensichtlichen Rennzustand, in dem der Hauptfaden wartet, und speitet das Wartegriffobjekt, das eine ObjectDindeclementException-Ausnahme verursacht.Gibt es eine andere Art und Weise, dass ich das so einsetze, so dass der Griff ordnungsgemäß angeordnet ist und ohne die Ausnahme zu verursachen?

War es hilfreich?

Lösung

Sicher, es gibt keinen anständigen Weg, dies zu tun. Beachten Sie die Vorderseite, dass Sie sich in dieser Ecke in diese Ecke bemalt, indem Sie im Wesentlichen einen wild laufenden Thread verlassen, nichts besonders nett dazu.

Aber Sie konzentrieren sich auf das viel kleinere Problem. Die Thread-Klasse selbst ist bereits ein Ressourcenschwein, das einen Megabyte von VM- und fünf Synchronisationsobjekten verbraucht. Es hat jedoch keine Entsorgungsmethode (). Dies war mutiges Design, es gibt nur keinen angemessenen Weg, um die Methode aufzurufen.

Deading ist optional , nichts, was dramatisch passiert, wenn Sie es nicht nennen. Die Klasse hat Ihren Rücken, es hat einen Finalizer, der dafür sorgt, dass das native Betriebssystemressourcen freigegeben wird. Welches wird läuft, einfach nicht so schnell, wie Sie möchten.

Vergleichen Sie dies mit einem weniger mutigen Design mit einer Klasse mit weniger mutigem Design, die Task-Klasse hat eine Entsäuerungsmethode (). Was wie Thread fast so schwer zu rufen ist. Die Anleitung von .NET GURUS ist zu einfach nicht die Mühe

das gleiche hier.

Andere Tipps

Der WAITHANDLE ist angespannt, da Ihre Verwendung von Umfang einen neuen Thread auftrifft, um sofort ein neues Thread auftrifft, wodurch der Waitandle entsorgen kann.

was Sie tun sollten, ist explizit anzurufen, nachdem Sie Ihre Arbeit abgeschlossen haben, anstatt Ihrer Anweisung:

generasacodicetagpre.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top