Ну, проблема в цикле while
в клиентском методе Connect
.
Удалите его, потому что он зацикливается, увеличивая нагрузку на процессор до 100%, и это бесполезно.
Кстати, у вас есть другие проблемы в вашем коде:
- Исключение операции CrossThread
Например, в вашем методе Client.Recieve
вы делаете:
label1.Text = Encoding.ASCII.GetString(g_bmsg, 0, g_bmsg.Length);
На самом деле вы пытаетесь установить текст метки из другого потока (прослушивающего полученные сообщения), а это не разрешено;
Сделайте что-то вроде этого:
Создание метода Setter для текста метки:
private void SetLabelText(string txt)
{
if (label1.InvokeRequired)
label1.Invoke(new MethodInvoker(delegate { SetLabelText1(txt); }));
else
label1.Text = txt;
}
затем используйте сеттер вместо прямого вызова label1.Text = ...
:
SetLabelText(Encoding.ASCII.GetString(g_bmsg, 0, g_bmsg.Length));
РЕДАКТИРОВАТЬ, чтобы ответить на комментарий OP:
Хорошее и подробное объяснение темы можно найти на странице википедии .
В любом случае, простыми словами, запущенный процесс содержит один или несколько потоков, и они являются частью кода, который может выполняться одновременно.
Начиная с вашего примера TCP, используя Socket.Receive
вместо Socket.BeginReceive
, вы бы заблокировали выполнение при вызове Socket.Receive()
(я имею в виду строки кода после той, которая содержит метод Receive
, не будет достигнута) пока что-то не получено.
Это потому, что метод Socket.Receive
выполняется в том же потоке следующего кода, а в каждом потоке код выполняется последовательно (то есть построчно).
И наоборот, используя Socket.BeginReceive
, за сценой создается новый поток. Этот поток, вероятно, вызывает и останавливается на Socket.Receive
методе и, получив что-то, вызывает метод, переданный в качестве параметра.
Это делает Socket.BeginReceive
асинхронным, в то время как Socket.Receive
является синхронным, и поэтому я знал, что это был другой поток (когда вы слышите асинхронное слово, очень вероятно, что вы имеете дело с многопоточностью)
Таким образом, когда вы изменяете label.Text
, вы фактически настраиваете его из другого потока: созданного Socket.BeginReceive
.