Этот код определенно нуждается в некотором рефакторинге для начала - слишком много потоков, и все в очень узком контексте!
Краткий ответ:
Проблема сводится к тому, что функция Connect
вызывается не в те моменты (или даже в порядке), которые вы ожидаете, а только после завершения цикла.
Длинный ответ:
Это довольно типичный сценарий проблем параллелизма при попытке использовать переменные / свойства в пределах экземпляра в функциях. Насколько я могу судить, проблема не получения желаемого значения для Port
не имеет прямого отношения к блокировке как таковой. (Это может быть решено таким образом, но не очень изящно и не так, как вы, вероятно, думаете.) В конечном счете, вы не можете контролировать, как блоки времени выделяются различным потокам на уровне процессора, поэтому вы не знаете, какие функции выполняются в каком порядке. Вы также, кажется, смешиваете принципы дизайна с состоянием и без состояния (функциональный), что неизбежно приведет к неприятностям. Придерживайтесь одного - предпочтительно последнего в этом случае - и у вас будет гораздо больше успеха.
Так что я надеюсь, что я буду резок, если скажу, что было бы полезно прочитать немного о многопоточности - это чрезвычайно сложная тема - и попрактиковаться в некоторых общих принципах. Удачи!