【发布时间】:2026-01-19 07:35:01
【问题描述】:
我编写了一个尝试读取服务器发送的字节数据的类,当我的应用程序结束时,我也希望循环结束,但它似乎 NetworkStream.Read() 只是在没有可用数据时等待。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Threading;
using System.Net;
using System.Threading.Tasks;
namespace Stream
{
class Program
{
private static TcpClient client = new TcpClient("127.0.0.1", 80);
private static NetworkStream stream = client.GetStream();
static void Main(string[] args)
{
var p = new Program();
p.Run();
}
void Run()
{
ThreadPool.QueueUserWorkItem(x =>
{
while (true)
{
stream.Read(new byte[64], 0, 64);
}
});
client.Close();
// insert Console.ReadLine(); if you want to see an exception occur.
}
}
}
使用这段代码,我们会得到
-
System.IO.IOException说“无法从传输连接中读取数据:现有连接被远程主机强行关闭”, -
ObjectDisposedException说“无法访问已处置的对象”,或者 -
System.IO.IOException说“阻塞操作被对 WSACancelBlockingCall 的调用中断”。
那么我怎样才能安全地结束这个方法呢?
【问题讨论】:
标签: c# sockets tcpclient networkstream