c# - 重复消息,但不应在任务中重复此消息
问题描述
看图片中的问题。服务器启动一个新的任务来接受客户端,然后在函数句柄(客户端)中处理它,这一切都很好,但是每次它重复这个消息“客户端连接......”,但它不应该。除了这条消息之外,没有其他任务被调用。并且 bool Pending() 是假的,所以它不应该启动另一个任务。
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace WebServer
{
class WebServer
{
public static WebServer Server { get; private set; }
private TcpListener _tcpListener = null;
public CancellationTokenSource TokenSource { get; private set; }
public CancellationToken Token { get; private set; }
public int i = 0;
static void Main(string[] args)
{
WebServer.Server = new WebServer();
}
WebServer()
{
IPAddress ipAddress;
try
{
ipAddress = IPAddress.Parse("127.0.0.1");
} catch(Exception e)
{
Console.WriteLine("Error while parsing ip address: " + e.Message);
return;
}
_tcpListener = new TcpListener(ipAddress, 8080);
_tcpListener.Start();
TokenSource = new CancellationTokenSource();
Token = TokenSource.Token;
//Execute server
Task.Run(() => Run());
Console.ReadKey();
TokenSource.Cancel();
WaitHandle handle = Token.WaitHandle;
handle.WaitOne();
}
private void Run()
{
Console.WriteLine("Server is runnning");
while(!Token.IsCancellationRequested)
{
if(_tcpListener.Pending())
{
Console.WriteLine("Pending: " + _tcpListener.Pending());
Task.Run(() => {
Console.WriteLine("Client connecting...");
TcpClient client = _tcpListener.AcceptTcpClient();
this.Handle(client);
return;
});
}
}
}
private void Handle(TcpClient client)
{
NetworkStream stream = client.GetStream();
Console.WriteLine("Handling....");
while(client.Connected)
{
if(stream.DataAvailable)
{
Console.WriteLine("Start Reading...");
byte[] buffer = new byte[1024];
stream.Read(buffer, 0, 1024);
Console.WriteLine("Read: " + Encoding.ASCII.GetString(buffer));
}
client.Close();
}
}
}
}
客户端连接不应该每次都重复,其他一切正常
解决方案
Emrah Süngü 的评论似乎准确无误
TcpClient client = _tcpListener.AcceptTcpClient(); // accept first
Console.WriteLine("Client connecting...");
// then start processing in your task
Task.Run(() => this.Handle(client));
当您考虑它时,这是非常有意义的,您处于一个while循环中,并且您在代码之前启动了几个任务,除了客户端实际运行。
免责声明:这完全未经测试,我不对您使用此代码对他人或您自己造成的伤害负责和伤害:)