Wickeln Sie ein AutoresetEvent -Objekt in einen eingeschränkten Wartehandle ein?
-
26-10-2019 - |
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.
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.