Voici une version très simplifiée de ce que je suis en train de faireEnregistrement d'une référence à un int
static void Main(string[] args)
{
int test = 0;
int test2 = 0;
Test A = new Test(ref test);
Test B = new Test(ref test);
Test C = new Test(ref test2);
A.write(); //Writes 1 should write 1
B.write(); //Writes 1 should write 2
C.write(); //Writes 1 should write 1
Console.ReadLine();
}
class Test
{
int _a;
public Test(ref int a)
{
_a = a; //I loose the reference here
}
public void write()
{
var b = System.Threading.Interlocked.Increment(ref _a);
Console.WriteLine(b);
}
}
Dans mon code réel que j'ai un int qui sera incrémenté de nombreux fils mais où les fils d'un appelé il ne sera pas facile de lui passer le paramètre qui le pointe à l'int (dans le vrai code cela se passe à l'intérieur d'un IEnumerator
). Donc, une exigence est la référence doit être faite dans le constructeur. De même, tous les threads ne pointeront pas sur la même base int, donc je ne peux pas non plus utiliser un static statique global. Je sais que je peux juste boxer l'int à l'intérieur d'une classe et passer le cours, mais je voulais savoir si c'est la bonne façon de faire quelque chose comme ça?
Ce que je pense pourrait être la bonne façon:
static void Main(string[] args)
{
Holder holder = new Holder(0);
Holder holder2 = new Holder(0);
Test A = new Test(holder);
Test B = new Test(holder);
Test C = new Test(holder2);
A.write(); //Writes 1 should write 1
B.write(); //Writes 2 should write 2
C.write(); //Writes 1 should write 1
Console.ReadLine();
}
class Holder
{
public Holder(int i)
{
num = i;
}
public int num;
}
class Test
{
Holder _holder;
public Test(Holder holder)
{
_holder = holder;
}
public void write()
{
var b = System.Threading.Interlocked.Increment(ref _holder.num);
Console.WriteLine(b);
}
}
Y at-il une meilleure façon que cela?
Est-ce que cela signifie que mon deuxième exemple est la façon de faire les «meilleures pratiques»? –
Si vous avez besoin de le faire, oui, ou vous pouvez basculer vers un code dangereux et des pointeurs de lobby autour. –
@Lase: mais vous devez "épingler" les cibles. Pas très pratique. –