2013-12-08 3 views
0
class Port 
{ 
    static readonly object locker = new object(); 
    List<Connection> listOfConnections = new List<Connection> 

    public void MethodX() 
    { 
     Thread.Sleep(10000); 
     lock(locker) 
     { 
      listOfConnections.RemoveAt(0); 
     } 
    } 

    public void ReceiveFromSwitch() 
    { 
     lock(locker) 
     { 
      if(listOfConnections.Count == 0) listOfConnections.Add(new Connection()); 
      if(listOfConnections.Count == 1) MessageBox.Show("Whatever"); 

      new Thread(()=>MetohodX()).Start(); 
     } 
    } 
} 

Это мой код, два разных потока называют метод ReceiveFromSwitch(). Моя цель - получить сообщение «Что бы ни случилось». Сначала начинается один поток. Он переходит в ReceiveFromSwitch, блокирует ресурс, а второй поток ожидает освобождения ресурса. Добавляется соединение в списке, оно переходит в MethodX() и освобождает метод ReceiveFromSwitch для потока в очереди. Второй - метод. Счет равен 1, поэтому он показывает сообщение.Замок в многопоточном режиме

Не работает. Он дает два сообщения «Что бы ни случилось». Как я могу это исправить?

+0

Глупый вопрос, но это два потока, вызывающие метод в том же экземпляре 'Port'? Потому что список не является статичным. – Rotem

+0

Да. это тот же самый экземпляр. – user3076439

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

ответ

1

Вы забыли другое.

if(listOfConnections.Count == 0) listOfConnections.Add(new Connection()); 
else if(listOfConnections.Count == 1) MessageBox.Show("Whatever"); 

//or better yet 
if (listOfConnections.Any()) 
{ 
    MessageBox.Show("Whatever"); 
} 
else 
{ 
    listOfConnections.Add(new Connection()); 
} 

То, что происходит это первый поток входит и добавляет подключение к списку, а затем сразу же показывает сообщение, потому что Count теперь 1. Второй поток входит, как и ожидалось, показывает второе сообщение.

Есть еще одна проблема с вашим кодом. Второй поток также запускает MethodX, а когда он выполняется через 10 секунд, он попытается удалить индекс 0 из уже пустого списка, вызвав ArgumentOutOfRangeException.

+0

Спасибо, однако это был просто пример, основанный на гораздо более длинном коде. Решение было глубже. Локер отлично справлялся, но я был настолько смущен, что я подозревал, что моя некомпетентность была причиной неправильной работы. – user3076439

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