Ich versuche, eine generische Methode zu erstellen, die einen Delegaten akzeptiert. Der einzige Zweck der Methode besteht darin, sicherzustellen, dass jeder eindeutige Codeblock, den Sie an ihn übergeben, nur von jeweils einem Thread gleichzeitig aufgerufen wird. Ich betone das Wort einzigartig, da eindeutige Codeblöcke nebeneinander laufen können, müssen doppelte Codeblöcke synchron laufen. Gibt es ein sauberes Muster, um dies zu erreichen?Wie erzwinge ich einen Mutex auf einem Delegaten
Antwort
Sie können etwas tun:
namespace RunSafe
{
// Declare a delegate type
public delegate void RunSafeDelegate();
public class SafeRunner
{
private object _lock = new Object();
public void Runner(RunSafeDelegate runsafe)
{
lock(this._lock)
{
runsafe();
}
}
}
}
Danke Dex. Gibt es eine Möglichkeit, die Sperre nur dann zu erzwingen, wenn der Codeblock derselbe ist? Ich brauche das im Wesentlichen zu skalieren, damit, wenn ein anderer Block des Codes hereinkommt, es als eine getrennte Sperre handeln sollte. – user1701153
@ user1701153 das ist kein guter Weg, es zu tun. Code ist unveränderlich. Es muss nicht geschützt werden. Sperren schützen Daten, nicht Code. – usr
@usr Letztendlich handelt der Code auf Dinge, die ich schützen muss. Zum Beispiel könnte ein Codeblock, den ich übergeben würde, einen freien tcp-Port erhalten. Ich möchte das synchronisieren, um Kollisionen zu vermeiden. Etc. – user1701153
Letztlich mich Dex Star Codebeispiel führen den Weg nach unten die ich suchte.
Wenn es irgendwelche Bedenken gibt, lass es mich wissen. Ich glaube, das ist eine solide Lösung. Hinweis: Ich verwende absichtlich einen benannten Mutex, da beim Zugriff auf Ressourcen möglicherweise mehrere Prozesse beteiligt sind.
// test code
RunSafeDelegate rsd1 =() => { /* some code i need synchronous */ };
RunSafeDelegate rsd2 =() => { /* other code i need synchronous */ };
var util = new UtilityClass();
util.RunSafe(rsd1, "myMutexName1");
util.RunSafe(rsd2, "myMutexName2");
// implementation
public class UtilityClass
{
public delegate void RunSafeDelegate();
public void RunSafe(RunSafeDelegate runSafe, string mutexName)
{
const int WAIT_ONE_TIMEOUT = 30000;
var sid = new SecurityIdentifier(WellKnownSidType.WorldSid, null);
var mar = new MutexAccessRule(sid, MutexRights.FullControl, AccessControlType.Allow);
var ms = new MutexSecurity();
ms.AddAccessRule(mar);
bool mutexCreated;
using(var mutex = new Mutex(false, mutexName, out mutexCreated, ms))
{
var signalReceived = false;
try
{
try
{
signalReceived = mutex.WaitOne(WAIT_ONE_TIMEOUT, false);
if(!signalReceived)
{
throw new TimeoutException("Exclusive access timeout for mutex: " + mutexName);
}
}
catch(AbandonedMutexException)
{
signalReceived = true;
}
runSafe();
}
finally
{
if(signalReceived)
{
mutex.ReleaseMutex();
}
}
}
}
}
Ich bin froh, dass du hast, was du brauchst. Wenn Sie Mutexes verwenden, sind sie IDisposable, also sollten Sie 'using (var mutex = neuer Mutex (false, mutexName)) {}' ... verwenden. Da Ihre Klasse keine Instanzmitglieder mehr hat, können Sie sie erstellen und seine Methoden 'static' und vermeiden es, sie instanziieren zu müssen. –
@DexStar Danke Dex. Ich schätze den Rat sehr. Ich habe meine Implementierung basierend auf Ihrem Feedback und einigen tollen Informationen aktualisiert, die ich in einem anderen Beitrag gefunden habe: http://stackoverflow.com/questions/229565/what-isa-good-pattern-for-using-a-global- Mutex-in-c – user1701153
- 1. Wie erzwinge ich einen gemeinsamen Vorfahren in einem Git-Merge?
- 2. Wie setze ich einen Tableview-Delegaten
- 3. Wie erzwinge ich automatisch einen PDF-Download?
- 4. Wie erzwinge ich einen Versionskonflikt in iCloud
- 5. Wie deklariere ich einen Func-Delegaten, der einen Func-Delegaten des gleichen Typs zurückgibt?
- 6. Wie erzwinge ich einen Header auf einem Oktettstream, der von einem PHP-Dokument zurückgegeben wird?
- 7. Weisen Sie einen Delegaten basierend auf einem Typ zu?
- 8. Wie erzwinge ich einen Docker Push auf Mac OSX
- 9. Wie kann ich einen System Mutex in C# erstellen
- 10. Einen Verweis auf den UIApplication-Delegaten erhalten
- 11. Wie kann ich einen Action-Delegaten aus MethodInfo erstellen?
- 12. Wie deklariert man einen generischen Delegaten mit einem out-Parameter
- 13. Wie kann ich einen Mutex in einer Initialisierungsliste sperren?
- 14. Wie erzwinge ich einen Wert für einen String in Pony?
- 15. Wie kann ich einen asynchronen Delegaten in C# 3.5 abbrechen?
- 16. Wie erstellt man einen Mutex auf Klassenebene, der über Prozess
- 17. Wie erzwinge ich, dass Postgres einen bestimmten Index verwendet?
- 18. Erstellt einen Delegaten von MethodInfo?
- 19. Erstellt std :: mutex einen Zaun?
- 20. benötigt eine Getterfunktion einen Mutex?
- 21. Wie kann ich einen Delegaten in C++/CLI weiterleiten?
- 22. Wie erstelle ich einen Delegaten für eine .NET-Eigenschaft?
- 23. C# - Wie übergebe ich einen Delegaten an eine andere Methode?
- 24. Wie erzwinge Release auf iOS
- 25. Wie erzwinge ich eine Klasse?
- 26. Zufallsfehler auf Mutex-Sperre
- 27. Wie bekomme ich den aktuellen Extension-Delegaten auf watchOS?
- 28. einen Delegaten für UIWebView setzen
- 29. Wie erzwinge ich einen Zeilenumbruch bei einer JavaScript verketteten Zeichenfolge?
- 30. Wie erzwinge ich einen DataSource-Speicherort in Crystal Reports?
Verwenden Sie Mutex, Lock oder Sophomores? Was hast du genau versucht? – Mekap
Ich habe alle von ihnen ausprobiert. Ich suche wirklich nach dem richtigen Muster, hauptsächlich basierend auf den Anforderungen. – user1701153
@Mekap: Sie meinten Semaphor? –