voglio controllare alcuni comportamenti di chiusura e non riesco a capire questo:Blocco su un tipo primitivo
static void Main(string[] args)
{
for (int i = 0; i < 10; i++)
{
Task.Factory.StartNew(() =>
{
MultithreadedMethod();
});
}
Thread.Sleep(2000);
Console.WriteLine(count);
}
static int count = 0;
private static readonly int sync = 5;
public static void MultithreadedMethod()
{
if (Monitor.TryEnter(sync))
{
count++;
Monitor.Exit(sync);
}
}
ho pensato che questo non dovrebbe funzionare a causa del fatto che sto facendo la sincronizzazione su un valore intero . Prima Boxing, quindi Unboxing e io dovremmo ottenere un System.Threading.SynchronizationLockException a causa della radice del blocco di sincronizzazione mancante (so che questo è specifico per i tipi di riferimento). Non mi prenderò gioco di me stesso, anche se questo funziona per poche iterazioni, non è veramente sincronizzato .. quindi, prendendo in considerazione la proprietà non atomica dell'operazione di incremento .. non otterrò risultati deterministici .. sono consapevole di questo.
In effetti, quando mi sbarazzerò di quel Thead.Sleep e metto un Wait sull'Account .. l'eccezione entra in vigore.
Task.Factory.StartNew(() =>
{
MultithreadedMethod();
}).Wait();
penso un'eccezione dovrebbe essere gettato qui: Monitor.Exit(sync)
ma che cosa la prende?
Aggiornamento 1: immagine aggiunta.
Quando eseguo il codice precedente, genera un'eccezione da "Esci". Sicuro che stai catturando l'eccezione dall'attività? –
@PatrickHofman questo è tutto ciò che ho. Ho appena fatto la foto –