当前位置:编程学习 > C#/ASP.NET >>

UDPClient + 多线程 + windows服务程序


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); // 问题出在这句,一直处于堵塞状态,若不采用多线程,能接受到数据
    }
}

--------------------编程问答-------------------- 没人吗?自己顶 --------------------编程问答-------------------- copy代码请copy  全 --------------------编程问答--------------------

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);
                }
        }
}
--------------------编程问答-------------------- 来人那!!! --------------------编程问答--------------------
引用 4 楼 jerry_zjnb 的回复:
来人那!!!

到现在自己还意识不到为什么死机吗?那么你太缺乏代码“想”力了。你的大脑要是执行这几行代码,难道不死机吗? --------------------编程问答-------------------- 监听端口时,是一直处于等待状态,有消息过来,才会往下执行 --------------------编程问答-------------------- 用异步,直接Receive肯定阻塞。


    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)
            {
                
             }
        }


--------------------编程问答-------------------- 这个肯定是阻塞的啊,自己不看msdn的吗? --------------------编程问答--------------------
引用 5 楼 sp1234 的回复:
引用 4 楼 jerry_zjnb 的回复:来人那!!!
到现在自己还意识不到为什么死机吗?那么你太缺乏代码“想”力了。你的大脑要是执行这几行代码,难道不死机吗?


死机?不至于吧,该线程堵塞状态吧了。

以上各位说的都没错,这句是堵塞。但是,我通过另一台电脑给这台电脑发送信息,它也不会有任何反应,也就是根本接收不到UDP报文。

同样的代码,我用控制台程序能顺利收到报文。 --------------------编程问答-------------------- 写服务程序,当然至少要一个线程的,把 Task 放到线程中,另外,把 udpClient 定义到外面,然后:
protected override void OnStop()
{
    udpClient.Client.Shutdown(SocketShutdown.Both);
}
--------------------编程问答--------------------
引用 10 楼 tcmakebest 的回复:
写服务程序,当然至少要一个线程的,把 Task 放到线程中,另外,把 udpClient 定义到外面,然后:
C# code?1234protected override void OnStop(){    udpClient.Client.Shutdown(SocketShutdown.Both);}


"把 Task 放到线程中",这句什么意思?

谢谢!
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,