Здесь гораздо упрощенная версия того, что я пытаюсь сделатьСохранения ссылки на 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);
}
}
В моем реальном коде у меня есть Int, который будет увеличиваться многими нитями, однако, где нити вызываемых это будет непросто передать ему параметр, который указывает его на int (в реальном коде это происходит внутри IEnumerator
). Таким образом, требование должно быть сделано в конструкторе. Также не все потоки будут указывать на одну и ту же базовую строку int, поэтому я не могу использовать глобальный статический int. Я знаю, что я могу просто вставить int внутри класса и пройти класс, но я хотел знать, правильно ли это сделать что-то подобное?
То, что я думаю, что может быть правильный путь:
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);
}
}
Есть ли лучший способ, чем это?
Означает ли это, что мой второй пример - это способ «наилучших практик»? –
Если вам нужно это сделать, да, или вы можете переключиться на небезопасный код и указатели на лобби. –
@Lase: но вам придется «привязать» цели. Не очень практично. –