從this answer和Docs可以看出,對於併發流訪問,如果有一個唯一線程可供讀取,並且有一個唯一線程可供寫入,則可以在沒有問題的情況下執行讀取和寫入。在同一臺機器上併發訪問網絡流
我具有以下設置,如下圖還示出:
我有2個單獨的服務和Tester Service
My Service
。他們每個人都有一個Server
和一個Client
。每個服務器和客戶端有2個任務WriterTask
和ReaderTask
。
我面臨的問題是,經過一定的時間後,客戶端會給出IOException 10060。事實上,另一方面的服務器運行良好。
現在,該文檔說明了一個用於讀/寫操作的獨特線程,如果它位於同一臺計算機上,是否存在問題?
其他人面臨過類似的情況嗎?
服務器的讀者:
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);
}
}
}
客戶編劇:
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);
}
}
是的,我面臨類似的情況,問題出現在我的代碼中,與讀寫線程之間的分隔無關。你怎麼知道「服務器運行良好」?在崩潰的客戶端的'NetworkStream.Read()'操作中是否存在當前阻塞的線程? –
@ C.Evenhuis「服務器運行良好」 - 服務器的讀寫器任務生成日誌。所以我知道他們很好。但是服務器的閱讀器任務正在讀取流中的異步任務,並且無限期地被阻塞。我在下面的答案中提供了詳細的信息。如果你有更多的信息,如果你發佈一個答案並填寫更多的細節,這將是很好的。 –