简单说下我的大体情况就是 我 现在 搞上下位机  下位机是 stm32 用的 协议是lwip     我在里面编了就是 一直向上位机发送数据  每个包 1460  吧      然后 上位机 我就是 用的 vs2010 编的  语言是 vc#.net  现在 通信速度 基本是 1M/s 以上  但是 不是 很稳定      现在  就是 有个问题就是  我用的 阻塞的方式  当连接  服务器与客户端连接后  然后 开始 接收数据下面就是代码 其中 showMsg(stringdata );我是用的  委托 invoke  下面可以看见  就是 在 当前窗体    显示 接收到的数据  并且不断地 相加  
[/   while (Connected)
            {
              
                 
                try  {
                    if (jx)
                    {
                    int recv = newclient.Receive(data);
                        if (recv == 0)
                        {
                            MessageBox.Show("sorry   buffer  is  empty!!!!");
                            break;
                        }
                        y += recv;
                        Console.WriteLine(recv.ToString());
                        string stringdata = Encoding.ASCII.GetString(data, 0, recv);
                        showtext(y.ToString());
                        showMsg(stringdata );
                      
                    }
     }
                catch (Exception  e) 
                {  
                    MessageBox .Show(e.Message );
                  } 
               finally 
                {
                }
                }    
        }
]这是 showmsg(string msg)的程序 
 public void showMsg(string msg)
        {
            try
            {
                {
                    //在线程里以安全方式调用控件
                    if (receiveMsg.InvokeRequired)
                    {
                        MyInvoke _myinvoke = new MyInvoke(showMsg);
                        receiveMsg.Invoke(_myinvoke, new object[] { msg });
                    }
                    else
                    {
                        receiveMsg.AppendText(msg);                    }
                }
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message);
            }
            finally
            {
            }
        }
 现在 就是 我 发现 速度 不断的下降 不知道 是为什么  然后 我 怀疑 是不是显示这块 有问题 然后 我就把 showmsg   注释掉 发现速度  稳定下来了 能运行 半小时 以上 我想问下我 
一、 在不影响 接受速度的情况下我该怎么 编程    
二、我想用 异步 是否 好点?
三、或者我把显示 去掉直接 改为实时 保存到 某文件中区  还有 就是保存  最好用  什么形式保存 就是代码 我的 程序里面是  这样保存的  
 private void button1_Click(object sender, EventArgs e)
        {
            StreamWriter strWriter = new StreamWriter(@"D:\1.txt", false);//保存到C盘的store这个  txt文件里面
            strWriter.Write(receiveMsg .Text );
        }四 、如果 上面的解决了我想请问高手 就是 正常情况下 要考虑哪些 factor 去考虑 使他 编的更加的 健全 速度稳定 性上 更好    在此 希望大神们 能够 help me  
  本人  刚刚开始学 所以  不懂得很多   C#socket通信行业数据lwip

解决方案 »

  1.   

    int recv = newclient.Receive(data) 这一行以后的代码可以在另外一个子线程中执行。当然这一行代码可以改为使用BeginReceive。异步的程序要更加精炼、简洁。只要你用正确的思维方式去理解异步,它就非常自然。
      

  2.   

    你是怎么看是否收到数据的呢?另外随便问“这可能是什么原因呢?”我是不回去罗列什么东西的。我只能针对“亲自调试分析”过的信息来判断,我从来不多说空想的意见。例如你的 MessageBox.Show(e.Message) 这类代码,在多线程的程序中就不可能使用。通常可以把信息以 Debug.Print 方式打印出来。
      

  3.   

    本程序用的 就是 rcv 这个参数 然后  用定时 来判断 接受多少字节的数据 除以 秒数就是了 还有我这个  就是刚刚试验就好了 能运行很长时间   还有我这个还是 测试程序 很多东西不太懂 
      

  4.   

    1.receive数据后,如果马上进行处理,会影响接收数据的效率,所以,你可以将接收到的数据放入一个公共缓冲区,然后专门开辟线程进行处理
    2.如果确实不想另开辟线程,请将Invoke改为BeginInvoke,它不会阻塞接收数据线程
    3.对于这个需求,改为“异步模式”,性能替身效果不大
      

  5.   

    就是 我把 invoke  变成begininvoke  刚刚试验了一下 程序就是 运行几秒 就接收不到数据了 。。