Пометить isListening
как volatile
. Насколько я понимаю, вы ссылаетесь на этот флаг в двух разных потоках. Обычно данные, совместно используемые потоками, должны быть синхронизированы, но, похоже, вы этого не делаете. Однако, учитывая, что флаг является типом bool, технически вам не нужно синхронизировать доступ к нему, потому что .NET Framework гарантирует, что чтение и запись из типов bool являются атомарными (я думаю Я говорю это правильно ... кто-то, пожалуйста, поправьте меня, если это не технически правильно). Но, чтобы убедиться, что чтения из этого типа действительно получают самое последнее значение, вам нужно пометить его как volatile
.
Кроме того, вам лучше использовать класс TcpListener
вместо попыток сделать это с классом Socket
. То, что вы делаете, не является неправильным, но класс TcpListener
сделает ваш код проще для чтения и обслуживания, IMO.
Наконец, используемый вами объект locker
на самом деле ничего не делает, поскольку он является локальным для метода StartListen()
. Чтобы объекты синхронизации имели какой-либо эффект, они должны быть доступны для потоков, которым требуется сериализованный доступ к общим данным. Как вы делаете здесь, другие потоки не могут получить доступ к переменной locker
, что делает ее бесполезной.