J'exécute quatre threads qui obtiennent et définissent la même propriété. Quand j'utilise le point d'arrêt, il me donne le résultat attendu, mais quand je l'exécute directement, il me donne le dernier résultat mis à jour.Comment verrouiller une propriété setter pour un thread
Voici mon code
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);
}
}
Maintenant, ce que je vois ici est lorsque le code est exécuté i obtient 8003 dans toutes les boîtes de message. C'est peut-être parce que le premier thread 3 ne pouvait pas modifier la propriété entre-temps quand il a été accédé. Comment obtenir une serrure dans ce cas.
Pourquoi avez-vous réellement besoin de la propriété "Port"? Il y a beaucoup de problèmes avec ce code, mais commençons par le besoin de cette propriété. Que faire si vous le supprimez simplement et tout le code qui s'y rapporte? Au lieu de "Port" dans l'appel au constructeur IPEndPoint, passez simplement '(int) _port'. Cela ne résoudra-t-il pas tous vos problèmes? –
@Lasse: J'ai précédemment utilisé (int) _port uniquement et quand il a été exécuté avec succès, je l'ai remplacé par la propriété juste pour faire un certain RND et j'ai trouvé ce problème. C'est pourquoi. Sinon, j'ai eu l'idée d'utiliser la collection aussi. –