2013-04-29 3 views
0

Я использую пример кода ниже -Несколько экземпляров, Проблемы с перекрытием переменных C#

Program.cs имеет список клиентов, как:

public static List<Client> clients = new List<Client>(); 

с обработчиком события для мыши на button1

private void button1_Click(object sender, EventArgs e) 
{ 
    Client client = new Client(combobox1.selecteditem); 
    Program.clients.Add(client); 
} 

Client.cs

Все переменные не являются статичными и общественности. Существует EventHandler, где на прием пакетов, класс называется, этот класс затем фильтрует и обрабатывает

его называют в следующем коде:

public void recieved(short op, string str, Client c) 
{ 
    switch (op) 
    { 
     case (short)OpCodes.matches: 
     { 
      c.something(c, str); 
      break; 
     } 
    } 
} 

Handler.cs

public void something(Client c, string movement) 
{ 
    if (movement == null) 
     c.coords = movement; 
    c.freeSpot = true; 
} 

И в вышеупомянутом^переменные будут перекрываться, а freespot будет выполняться по всем экземплярам.

Он будет работать нормально с одним экземпляром. Но я пытаюсь скомпилировать несколько экземпляров. Таким образом, создание button_onclick создаст новый экземпляр, используя приведенное выше.

Поскольку программа запущена, она работает безупречно на одном экземпляре, но с экземплярами 2+ переменные в MyClass начинают перекрываться. Есть ли способ предотвратить это?

+2

Если вы используете визуальную студию, попробуйте использовать ее замечательный отладчик и отслеживайте все экземпляры разницы Клиента, предоставив им, например, уникальный код ID – Patashu

+0

. Каким выглядит код, который вызывает «полученный» (...) '? –

+0

код, вызывающий полученный (...), является обработчиком событий – user2309449

ответ

0

Я не могу сказать наверняка без дополнительного контекста, но это может быть проблемой параллелизма. Список не является потокобезопасным. Попробуйте использовать ConcurrentBag<T> вместо List<T>.

Смежные вопросы