I try to solve a problem in my program but I can't get done. The part which I have the problems is Modifier_le_solde_du_compte_a_partir_de_plusieurs_threads().
When I try to return the variable using Decimal Solde, it returns a random value instead of 0. The value returned in the assert must be equal to 0. Please help me.
This is the code in C#, Visual Studio.
Thanks you.
using System;
public class CompteBancaire {
    public decimal solde1;
    public bool bool_fermer = true;
    public void Ouvrir()
    {
        solde1 = 0;
    }
    public void Fermer()
    {
        if (solde1 <= 0)
        {
            bool_fermer = false;
        }
    }
    public decimal Solde
    {
        get
        {
            if (!bool_fermer)
            {
                throw new InvalidOperationException("");
            }
            return solde1;
        }
    }
    /// <summary>
    /// Mettre a jour le solde du compte bancaire.
    /// </summary>
    public void ReviserSolde(decimal change)
    {
        solde1 += change;
    }
}
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Xunit;
public class CompteBancaireTests
{
    [Fact]
    public void Retourne_un_solde_vide_apres_ouverture()
    {
        var compte = new CompteBancaire();
        compte.Ouvrir();
        Assert.Equal(0, compte.Solde);
    }
    [Fact]
    public void Verifier_le_solde()
    {
        var compte = new CompteBancaire();
        compte.Ouvrir();
        var solde_a_l_ouverture = compte.Solde;
        compte.ReviserSolde(10);
        var solde_mis_a_jour = compte.Solde;
        Assert.Equal(0, solde_a_l_ouverture);
        Assert.Equal(10, solde_mis_a_jour);
    }
    [Theory]
    [InlineData(10)]
    [InlineData(20)]
    public void Verifier_le_solde_random(int seed)
    {
        var compte = new CompteBancaire();
        compte.Ouvrir();
        var solde_a_l_ouverture = compte.Solde;
        var random = new Random(seed).Next(0, 100);
        compte.ReviserSolde(random);
        var solde_mis_a_jour = compte.Solde;
        Assert.Equal(0, solde_a_l_ouverture);
        Assert.Equal(random, solde_mis_a_jour);
    }
    [Fact]
    public void Le_solde_peut_augmenter_et_diminuer()
    {
        var compte = new CompteBancaire();
        compte.Ouvrir();
        var solde_a_l_ouverture = compte.Solde;
        compte.ReviserSolde(10);
        var ajouter_au_solde = compte.Solde;
        compte.ReviserSolde(-15);
        var soustraction_au_solde = compte.Solde;
        Assert.Equal(0, solde_a_l_ouverture);
        Assert.Equal(10, ajouter_au_solde);
        Assert.Equal(-5, soustraction_au_solde);
    }
    [Fact]
    public void Un_compte_ferme_lance_une_exception_lors_de_la_verification_du_solde()
    {
        var compte = new CompteBancaire();
        compte.Ouvrir();
        compte.Fermer();
        Assert.Throws<InvalidOperationException>(() => compte.Solde);
    }
    [Fact]
    public void Modifier_le_solde_du_compte_a_partir_de_plusieurs_threads()
    {
        var compte = new CompteBancaire();
        var liste_de_tasks = new List<Task>();
        const int nombre_de_threads = 500;
        const int iterations = 100;
        compte.Ouvrir();
        for (int i = 0; i < nombre_de_threads; i++)
        {
            liste_de_tasks.Add(Task.Run(() =>
            {
                for (int j = 0; j < iterations; j++)
                {
                    compte.ReviserSolde(1);
                    compte.ReviserSolde(-1);
                }
            }));
        }
        Task.WaitAll(liste_de_tasks.ToArray());
        Assert.Equal(0, compte.Solde);
    }
}