我正在運行四個線程獲取並設置相同的屬性。 當我使用斷點,然後它給我如預期的結果,但是當我直接運行它時,它給了我最後更新的結果。如何鎖定線程的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'。這不會解決你所有的問題嗎? – 2010-06-30 07:59:48
@Lasse:我以前只使用(int)_port,當它成功運行時,我用屬性替換它只是爲了做一些RND,並發現這個問題。這就是爲什麼。否則,我也有使用集合的想法。 – 2010-06-30 08:08:15