De this answer et Docs, il est indiqué que pour l'accès au flux concurrent, la lecture et l'écriture peuvent être effectuées sans problème s'il y a UN thread unique pour la lecture et UN thread unique pour l'écriture.Accès simultané du flux réseau sur la même machine
Je vais avoir la configuration suivante, également montré dans l'image ci-dessous:
J'ai 2 services distincts Tester Service
et My Service
. Chacun d'eux a un Server
et un Client
. Chacun des serveurs et clients a 2 tâches WriterTask
et ReaderTask
.
Le problème auquel je suis confronté est qu'après un certain temps, le client donne IOException 10060. En fait, le serveur de l'autre côté fonctionne bien.
Maintenant, la documentation indique un thread unique pour l'opération de lecture/écriture, y a-t-il un problème si c'est sur la même machine?
Quelqu'un d'autre faisait face à une situation similaire auparavant?
Reader serveur:
private void ReaderTask(NetworkStream stream)
{
while (true)
{
// Some code
try
{
if (stream.CanRead)
{
var readTask = Task.Run(() =>
{
MyObj message = null;
try
{
message = Deserialize<MyObj>(stream);
Console.WriteLine("ReaderTask: Read");
// Some code
}
catch (IOException e)
{
Console.WriteLine("ReaderTask: " + e.Message);
}
return message;
});
while(!readTask.Wait(1000))
{
Console.WriteLine("ReaderTask: Wait 1000");
}
if (readTask.Result != null)
{
Console.WriteLine("ReaderTask: Message received" + readTask.Result.toString());
}
}
}
catch (IOException e)
{
Console.WriteLine("ReaderTask: " + e.Message);
}
}
}
client Writer:
private void WriterTask(NetworkStream stream)
{
while (true)
{
// Some code
try
{
if (stream.CanWrite)
{
// message = getMessage();
Serialize(stream, message);
Console.WriteLine("WriterTask: Write");
// Some code
}
}
catch (IOException e)
{
Console.WriteLine("WriterTask: " + e.Message);
}
Thread.Sleep(1000);
}
}
Oui, j'ai fait face à une situation similaire et le problème était dans mon code, pas lié à la séparation entre les threads de lecture et d'écriture. Comment savez-vous que "le serveur fonctionne bien"? Y a-t-il un thread qui bloque actuellement l'opération 'NetworkStream.Read()' du client qui plante? –
@ C.Evenhuis "le serveur fonctionne bien" - les tâches de lecture et de lecture du serveur généraient des journaux. Et donc je savais qu'ils allaient bien. Mais la tâche de lecture du serveur lisait le flux dans une tâche asynchrone qui bloquait indéfiniment. J'ai mis des informations détaillées dans ma réponse ci-dessous. Si vous avez plus d'informations, ce serait bien si vous postez une réponse et remplissez plus de détails. –