Un'altra domanda a livello di linguaggio incrociato: qualcuno può dirmi quali sono i costrutti di C# Threading che meglio si adattano alle classi Java ReentrantLock e Condition? ReentrantLock ha metodi lockInterruptibly() e unlock(), mentre Condition ha metodi signal() e await(). È questa combinazione che vorrei poter conservare nel codice C# o qualcosa di simile ... Grazie in anticipo.La migliore corrispondenza in C# con Java ReentrantLock e Condition?
risposta
Penso che quello che stai cercando sia la classe statica Monitor. I consente l'acquisizione di mutex blocking e non-blocking, nonché le operazioni condition variable. (Li chiamano Pulse, PulseAll e Wait invece di segnalare e attendere).
DISCLAIMER: Non conosco queste classi Java, sto prendendo una pugnalata al buio qui.
In C#, si ha una dichiarazione lock
(penso che questo sia qualcosa come la dichiarazione di Java synchronized
) che può bloccare qualsiasi oggetto. Suppongo che l'utilizzo di tale affermazione, o Monitor.Enter(obj)
e Monitor.Exit(obj)
, sarebbe un po 'come ReentrantLock.
Esistono due classi chiamate ManualResetEvent
e AutoResetEvent
. Queste classi hanno un metodo Wait
e un metodo Set
, che suppongo sia come il segnale di Condition e attenda. La differenza tra queste due classi è che un ManualResetEvent
rimane impostato (non blocca più nessuno) e deve essere Reset
. E AutoResetEvent
è - come suggerisce il nome - ripristinato automaticamente.
Impossibile utilizzare il blocco nell'istruzione async e i metodi di monitoraggio devono essere richiamati dal thread sincronizzato .. il punto di ReentrantLock di Java è quello di far sparire quei problemi. – Vistritium
Visto che i metodi asincroni non esistevano in C# o in Java quando veniva posta questa domanda, penso che non sia proprio il punto di ReentrantLock, o almeno non il punto a cui il richiedente si riferiva. – configurator
Vale la pena esaminare anche la classe ReaderWriterLock. Questo è simile a ReentrantReadWriteLock in Java.
+1 per indicare la somiglianza. Ma MSDN consiglia di utilizzare [ReaderWriterLockSlim] (https://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx) su 'ReaderWriterLock'. – NightOwl888
- 1. C#, Cultura e Java Locale mancata corrispondenza
- 2. Corrispondenza '_' e '-' in java regex
- 3. Java - Trova elemento nell'array usando Condition e Lambda
- 4. Sincronizzata vs ReentrantLock sulle prestazioni
- 5. ambiguità tra la funzione const migliore corrispondenza e l'altra funzione
- 6. Sblocca ReentrantLock senza IllegalMonitorStateException
- 7. È necessario evitare più istruzioni if come "if (condition) if (condition) ..." in Java?
- 8. Semaforo binario rispetto a ReentrantLock
- 9. `if` condition efficiency
- 10. Scheda in Emacs-helm (qualsiasi cosa) non completa automaticamente con la migliore corrispondenza corrente
- 11. condition coverage in python
- 12. C# Regex - Corrispondenza e sostituzione, Incremento automatico
- 13. Java: Qualcuno ha un metodo per trovare la migliore corrispondenza di stringa nell'array?
- 14. generici Java: mancata corrispondenza Bound
- 15. Codeigniter seleziona query con AND e OR condition
- 16. Grep solo la prima corrispondenza e stop
- 17. ReactJS concomitante SetState race condition
- 18. cakephp OR condition
- 19. Corrispondenza e legami di Spearman
- 20. Nessuna corrispondenza con C++ 11 regex
- 21. SQL Server Race Condition Domanda
- 22. sqlite select with condition
- 23. PHP {$ condition} && execute();
- 24. Corrispondenza testo fuzzy C#
- 25. Utilizzare l'eccezione per la mancata corrispondenza del tipo in C#
- 26. Greater than Condition in Linq Join
- 27. Elementi di corrispondenza tra 2 raccolte con Linq in C#
- 28. Il modo migliore/più rapido per imparare Java per uno sviluppatore esperto .NET/C# e C++
- 29. La migliore libreria XMPP Java mantenuta attivamente?
- 30. Uso effettivo del bloccoInterruptibly per un ReentrantLock
Sembra funzionare per me! Grazie! Un'altra domanda: Monitor fornisce una controparte per Java isHeldByCurrentThread()? –
No, è possibile estendere Monitor e mantenere un riferimento al thread che ha chiamato con successo Enter o TryEnter. È possibile accedere al thread corrente utilizzando Thread.CurrentThread: http://msdn.microsoft.com/en-us/library/system.threading.thread.currentthread.aspx –