2009-03-05 9 views
8

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

8

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).

+0

Sembra funzionare per me! Grazie! Un'altra domanda: Monitor fornisce una controparte per Java isHeldByCurrentThread()? –

+0

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 –

0

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.

+0

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

+0

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

1

Vale la pena esaminare anche la classe ReaderWriterLock. Questo è simile a ReentrantReadWriteLock in Java.

+0

+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

Problemi correlati