解决方案 »

  1.   

    client.BeginReceive(so.buffer, 0, StateObject.BUFFER_SIZE, 0, 
                                         new AsyncCallback(Async_Send_Receive.Read_Callback), so);
      

  2.   

    要么在Receive的时候改为异步,要么就在richTxt.Invoke(objproxy, new object[] { suffixobj });
    的时候改为异步委托,总之这两个地方都会阻塞线程。
      

  3.   

    socket连接和接收数据都用异步比较好,如果发送信息比较频繁,坚持设置成长连接。给你个网址吧,很全,可以参考下。
    http://blog.csdn.net/ts_coo/article/category/1188088
      

  4.   

    异步编程模型(APM)  涉及到Socket通信、串口通信等等等
    详细参考 http://www.cnblogs.com/xiaozhi_5638/p/3167794.html
      

  5.   

    一句话 解决 Task.Factory.StartNew(() => 你的函数名称());你的函数名称 可以处理等待 更新Lable 等 不会阻塞主线程的.
    4.0下可以这么用
    楼上什么同步异步的方案 2.0下用用差不多,4.0在用这个太复杂,太落伍了
    MS 就是知道自己的同步异步太麻烦了,才封装了一次,出现TPL方式
    具体 可以百度 C# TPL
      

  6.   

    窗体:
    //监听消息
    StartUdpThread startUdpThread = new StartUdpThread(列表控件...等参数);//自定义的类
    System.Threading.Thread startThread = new System.Threading.Thread(new System.Threading.ThreadStart(startUdpThread.StartUdp));//StartUdp未自定义监听方法
    startThread.IsBackground = true;
    startThread.Start();
    StartUdpThread 类:
    class StartUdpThread
    {
       private ListView list;
       ...
       public StartUdpThread(ListView list,...)
       {
          this.list = list;
       }
       public void StartUdp()
       {
           System.Net.Sockets.UdpClient udpCLient = new System.Net.Sockets.UdpClient(2425);
           System.Net.IPEndPoint ipEndPoint = new System.Net.IPEndPoint(System.Net.IPAddress.Any,0);
           while (true)
           {
              //读取并处理消息
           }
       }
    }
      

  7.   


    试了Task ,也是阻塞主界面。可能我没写对。然后又使用BeginReceive,接收到数据了,有长度返回,
    但是我解析不出来。C#我是零零碎碎学的,系统不起来。
      

  8.   

    弄出来了,while (true)
                {
                    if (richTxt.InvokeRequired)
                    {
                        delegateWaitMessage objproxy = waitForMessage;
                        richTxt.Invoke(objproxy, new object[] { suffixobj });
                    }
                }
    有个例子上if 后面有个else,我不明白什么意思就把else后面的给去了,后来在一个类似的功能里看到有else
    能成功,就把自己的加了else结果对了。不过还是没明白为什么这么实现,。也不用异步接收,异步连接等。 private void button1_Click(object sender, EventArgs e)
            {
     ParameterizedThreadStart pstart = new ParameterizedThreadStart(recMessage);
                    Thread mythread = new Thread(pstart);
                    string suffixobj = myCarSuffix.ToString();
                    mythread.IsBackground = true;
                    mythread.Start(suffixobj);
       
                }
                catch (Exception ee)
                {
                    richtxt.AppendText("网络连接异常\n");
                }
            }
            private delegate void delegateWaitMessage(object tmp);        private void showMsgInTxt(object stateobjin)
            {            Simobject stateobj = (Simobject)stateobjin;
                string suffix = stateobj.suffix.ToString();
                RichTextBox richTxt;
                if (!suffix.Equals("0"))
                {
                    richTxt = (RichTextBox)(tabControl1.Controls.Find("richTextBox1" + suffix, true)[0]);
                    stateobj = clientmap["cars1" + suffix];
                }
                else
                {
                    richTxt = richTextBox1;
                    stateobj = clientmap["cars1"];
                }            if (richTxt.InvokeRequired)
                {
                    delegateWaitMessage objproxy = showMsgInTxt;
                    richTxt.BeginInvoke(objproxy, new object[] { stateobj });
                }
                else
                {
                    richTxt.AppendText(stateobj.result+"\n");
                    richTxt.Update();
                }        }        private void recMessage(object suffixobj)
            {
                
                string suffix = suffixobj.ToString();
                RichTextBox richTxt;
                Socket client;
                Simobject state;
                if (!suffix.Equals("0"))
                {
                    richTxt = (RichTextBox)(tabControl1.Controls.Find("richTextBox1" + suffix, true)[0]);
                    client = ((Simobject)clientmap["cars1" + suffix]).workSocket;
                    state = clientmap["cars1" + suffix];
                }
                else
                {
                    richTxt = richTextBox1;
                    client = ((Simobject)clientmap["cars1"]).workSocket;
                    state = clientmap["cars1"];
                }
                while (true)
                {
                        int bytesRead = client.Receive(state.buffer);
                        if (bytesRead > 0)
                        {
                            string stringdata = Utils.byteToHexStr(state.buffer, bytesRead);
                            state.result = ParseResponse.ParseData(stringdata);
                            showMsgInTxt(state);
                        }
                }
            }    class Simobject
        {
            public Socket workSocket = null;
            public static int BUFFER_SIZE = 256;
            public byte[] buffer = new byte[BUFFER_SIZE];
            public StringBuilder sb = new StringBuilder();
            public string result="";
            public object suffix;
        }
      

  9.   

    用java怎么写,我也向实现这个功能。初学java