UDPClient + 多线程 + windows服务程序

jerry_zjnb 2013-04-02 11:08:02

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

...全文
236 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jerry_zjnb 2013-04-07
  • 打赏
  • 举报
回复
引用 10 楼 tcmakebest 的回复:
写服务程序,当然至少要一个线程的,把 Task 放到线程中,另外,把 udpClient 定义到外面,然后: C# code?1234protected override void OnStop(){ udpClient.Client.Shutdown(SocketShutdown.Both);}
"把 Task 放到线程中",这句什么意思? 谢谢!
tcmakebest 2013-04-05
  • 打赏
  • 举报
回复
写服务程序,当然至少要一个线程的,把 Task 放到线程中,另外,把 udpClient 定义到外面,然后:
protected override void OnStop()
{
    udpClient.Client.Shutdown(SocketShutdown.Both);
}
一根葱的无奈 2013-04-05
  • 打赏
  • 举报
回复
这个肯定是阻塞的啊,自己不看msdn的吗?
jerry_zjnb 2013-04-05
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
引用 4 楼 jerry_zjnb 的回复:来人那!!! 到现在自己还意识不到为什么死机吗?那么你太缺乏代码“想”力了。你的大脑要是执行这几行代码,难道不死机吗?
死机?不至于吧,该线程堵塞状态吧了。 以上各位说的都没错,这句是堵塞。但是,我通过另一台电脑给这台电脑发送信息,它也不会有任何反应,也就是根本接收不到UDP报文。 同样的代码,我用控制台程序能顺利收到报文。
wtsky 2013-04-04
  • 打赏
  • 举报
回复
用异步,直接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)
            {
                
             }
        }


zzsab 2013-04-04
  • 打赏
  • 举报
回复
监听端口时,是一直处于等待状态,有消息过来,才会往下执行
  • 打赏
  • 举报
回复
引用 4 楼 jerry_zjnb 的回复:
来人那!!!
到现在自己还意识不到为什么死机吗?那么你太缺乏代码“想”力了。你的大脑要是执行这几行代码,难道不死机吗?
jerry_zjnb 2013-04-04
  • 打赏
  • 举报
回复
来人那!!!
jerry_zjnb 2013-04-03
  • 打赏
  • 举报
回复

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);
                }
        }
}
失落的神庙 2013-04-03
  • 打赏
  • 举报
回复
copy代码请copy 全
jerry_zjnb 2013-04-03
  • 打赏
  • 举报
回复
没人吗?自己顶

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧