Frage

Ich habe eine Bibliothek erstellt, in der ein Thread für das Ding gestartet wird, und gibt den Anrufer einen Wartehandle zurück.

Wenn ich mich einen Fehlerbericht ansieht, vermute ich, dass der Code, der meine Bibliothek anruft, das zurückgegebene Objekt nimmt und ihn an einen AutoresetEvent (das ist) und die Flagge selbst erhöht. Es ist nicht dazu gedacht, das zu tun.

Gibt es eine Möglichkeit, das Autoresetevent -Objekt mit einem Waitone und Waitany'd zu wickeln, aber nur von meinem Code angehoben werden kann?

Vielen Dank.

War es hilfreich?

Lösung

Sie können eine neue Klasse erstellen, die abgeleitet ist EventWaitHandle und überschreiben Set und Reset Also machen sie nichts oder machen eine Ausnahme. Eigentlich müssten Sie erstellen new Implementierungen seit Set und Reset sind nicht virtuell. Natürlich müssten Sie Ihre eigenen, anderen benannten Methoden erstellen. Wie MyInternalSet und MyInternalReset. Möglich, aber ich würde es nicht empfehlen.

Stattdessen würde ich dokumentieren, dass der Kunde das Ereignis nicht festlegen oder zurücksetzen sollte, da dies unvorhersehbares Verhalten verursacht.

Sie könnten a erstellen WaitHandle-Elte Klasse, die Ihre hält AutoResetEvent als an internal Eigentum. Der Client -Code kann dann nicht darauf zugreifen. Etwas wie:

public class MyWaitHandle: WaitHandle
{
    internal AutoResetEvent InternalEvent { get; private set; }
    internal MyWaitHandle(AutoResetEvent event)
    {
        InternalEvent = event;
    }

    public override bool WaitOne(int32 timeout)
    {
        return InternalEvent.WaitOne();
    }
}

Sie müssen die geschützten Überschreibung überschreiben Dispose(Boolean) Methode, damit es den internen Griff entsorgt und Sie den anderen wollen WaitOne Überladungen auch. Sie können dann erstellen internal Implementierungen von Set und Reset, oder haben Sie einfach Ihren Code -Anruf InternalHandle.Set.

Ich denke immer noch, dass die beste Vorgehensweise darin besteht, dem Kunden zu sagen, dass er das nicht tun soll. Aber wenn Sie es verhindern müssen, sollte das oben genannte funktionieren.

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