UDPClient + 多线程 + windows服务程序
--------------------编程问答-------------------- 没人吗?自己顶 --------------------编程问答-------------------- copy代码请copy 全 --------------------编程问答--------------------
protected override void OnStart(string[] args)
{
Task task = Task.Factory.StartNew(testThread);
}
private void testThread()
{
UdpClient udpClient = new UdpClient(8001);
IPEndPoint server = new IPEndPoint(IPAddress.Parse("192.168.11.11"), 8001);
while (true)
{
byte[] recvData = udpClient.Receive(ref server); // 问题出在这句,一直处于堵塞状态,若不采用多线程,能接受到数据
}
}
--------------------编程问答-------------------- 来人那!!! --------------------编程问答--------------------
public partial class Service1 : ServiceBase
{
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
Task task = Task.Factory.StartNew(testThread);
}
private void testThread()
{
UdpClient udpClient = new UdpClient(8001);
IPEndPoint server = new IPEndPoint(IPAddress.Parse("192.168.11.11"), 8001);
while (true)
{
byte[] recvData = udpClient.Receive(ref server); // 问题
string dataString = Encoding.ASCII.GetString(recvData);
}
}
}
到现在自己还意识不到为什么死机吗?那么你太缺乏代码“想”力了。你的大脑要是执行这几行代码,难道不死机吗? --------------------编程问答-------------------- 监听端口时,是一直处于等待状态,有消息过来,才会往下执行 --------------------编程问答-------------------- 用异步,直接Receive肯定阻塞。
--------------------编程问答-------------------- 这个肯定是阻塞的啊,自己不看msdn的吗? --------------------编程问答--------------------
public static void StartServer()
{
IPEndPoint ip = new IPEndPoint(IPAddress.Parse(IP), Port);
udpserver = new UdpClient(ip);
udpserver.BeginReceive(ReciveCallBack, udpserver);
}
public static void ReciveCallBack(IAsyncResult ar)
{
try
{
UdpClient udp = ar.AsyncState as UdpClient;
IPEndPoint remote = new IPEndPoint(IPAddress.Any, 0);
byte[] data = udp.EndReceive(ar, ref remote);//获取接收的数据
Console.WriteLine(string.Format("来自{0}的数据", remote.ToString());
udpserver.BeginReceive(ReciveCallBack, udpserver);
}
catch (Exception ex)
{
}
}
死机?不至于吧,该线程堵塞状态吧了。
以上各位说的都没错,这句是堵塞。但是,我通过另一台电脑给这台电脑发送信息,它也不会有任何反应,也就是根本接收不到UDP报文。
同样的代码,我用控制台程序能顺利收到报文。 --------------------编程问答-------------------- 写服务程序,当然至少要一个线程的,把 Task 放到线程中,另外,把 udpClient 定义到外面,然后:
protected override void OnStop()--------------------编程问答--------------------
{
udpClient.Client.Shutdown(SocketShutdown.Both);
}
"把 Task 放到线程中",这句什么意思?
谢谢!
补充:.NET技术 , C#