동일한 속성을 가져오고 설정하는 네 개의 스레드를 실행 중입니다. 내가 브레이크 포인트를 사용하면 예상대로 결과를 얻을 수 있지만 직접 실행하면 최종 업데이트 결과가 표시됩니다.스레드의 setter 속성을 잠그는 방법
여기에 코드 내가 모든 메시지 상자에 8003를 얻을 실행될 때
int Port { get; set; }
Thread[] tMain= new Thread[4];
public void btnListen_Click(object sender, EventArgs e)
{
for (int i = 0; i < 4; i++)
{
tMain[i] = new Thread(Connect);
tMain[i].IsBackground = true;
tMain[i].Start(8000+i);
}
}
public void Connect(object _port)
{
try
{
lock ((object)Port)
{
Port = (int)_port;
}
IPEndPoint ie = new IPEndPoint(IPAddress.Any, Port);
Socket listenSock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
listenSock.Bind(ie);
listenSock.Listen(100);
Thread tListen = new Thread(() => StartListening(listenSock, Port));
tListen.IsBackground = true;
tListen.Start();
}
catch (SocketException ex)
{
MessageBox.Show(ex.Message);
}
}
public void StartListening(Socket _socket, int port)
{
Socket tempSock,listenerSocket=(Socket)_socket;
MessageBox.Show("Thread Started"+port.ToString());
while (true)
{
MessageBox.Show("Waiting For Connection");
tempSock = listenerSocket.Accept();
Thread tInner = new Thread(ProcessMessages);
tInner.IsBackground = true;
tInner.Start(tempSock);
}
}
지금 내가 이상 여기에 무엇을보고 내 코드입니다. 처음 3 개의 스레드가 액세스 할 때 그 사이에 속성을 수정할 수 없었기 때문일 수 있습니다. 이 경우 잠금을 얻는 방법.
왜 실제로 "포트"속성이 필요합니까? 이 코드에는 많은 문제가 있지만 먼저 해당 속성에 대한 필요성부터 살펴 보겠습니다. 단순히 그 코드와 관련된 모든 코드를 제거하면 어떨까요? IPEndPoint 생성자에 대한 호출에서 "Port"대신'(int) _port'를 전달하면됩니다. 그게 모든 문제를 해결하지 않겠습니까? –
@Lasse : 이전에 (int) _port 만 사용했는데 성공적으로 실행 한 다음 속성으로 대체하여 일부 RND를 수행하고이 문제를 발견했습니다. 그래서 이유가 있습니다. 그렇지 않으면 나는 컬렉션을 사용하는 아이디어도 가지고 있었다. –