大致代码如下
trd =new Thread(new ThreadStart(receivemessage));
trd.Start();

private void receivemessage()
{
while(true)
{
byte[] byteReceiveMessage=new byte[100];
MySocket.Receive(byteReceiveMessage);
string ReceiveMessage=Encoding.Default.GetString(byteReceiveMessage);
this.ListBox1.Items.Add(ReceiveMessage);
}

解决方案 »

  1.   

    高手指教啊  在这代码中为什么窗体的listbox添加不了ReceiveMessage呢
      

  2.   

    可以的
    private void receivemessage()
    {
    while(true)
    {
    //byte[] byteReceiveMessage=new byte[100];
    //MySocket.Receive(byteReceiveMessage);
    //string ReceiveMessage=Encoding.Default.GetString(byteReceiveMessage);
    this.listBox1.Items.Add("aaa");

    }
      

  3.   

    这种东西的最终解决方案是:1:用事件通知窗体接收到了消息
    2:封装继承自System.EventArgs的消息参数类,传递接收到的消息SOCKET接收消息----实例化参数类对象(假设是e)----激发事件,把e作为事件参数传递窗体注册该SOCKET类事件----在事件处理代码中进行处理
      

  4.   

    我试了使用事件的方式 却不成功 以下是我用的思路  你看下是哪里出问题了
            //声明代表
    public delegate void SocketConnect(object sender,EventArgs e);
    //申明事件
    public event SocketConnect OnConnect;在委托方法中private void receivemessage()中
    this.OnConnect +=new WebForm3.SocketConnect(this.socket_Connect);
    然后又写了个方法对窗体进行操作
      

  5.   

    倒~事件是SOCKET类用的----比如说你的SOCKET类是CMySocket
    private void receivemessage()中用if(OnConnect != null)
    {
    实例化 e-----在e的类定义中要能包含足够的信息,比如说Socket接收到的字符串
    OnConnect(this, e);
    }
    然后在窗体的代码中
    CMySocket pCMySocket;pCMySocket.OnConnect  += new SocketConnect(this.aaa); ----在这里按TAB就可以了
    然后在函数aaa中写你自己的处理代码
      

  6.   

    兄弟 我是想用线程接收信息 你说的用实例化的e传递事件参数  可是怎么实例化e呢  怎么把要接收的信息包含在e类中呢 烦请兄弟再讲讲 耽误你时间就当是你赚点分吧  呵呵 我是新手 手中的分还没怎么用 :)
      

  7.   

    这不是事件的原因。
    是你使用了多线程的原因。
    你是在创建ListBox1的线程以外的线程调用ListBox1,所以调用ListBox1的方法或属性是不成功的,所以你要在调用ListBox1的方法的别的线程上将调用封送(用Invoke、BeginInvoke、EndInvoke)到创建ListBox1的线程上。那几个Invoke方法分别是用于同步和异步调用的。private delegate void NoticeDelegate(string msg);
    private void receivemessage()
    {
    while(true)
    {
    byte[] byteReceiveMessage=new byte[100];
    MySocket.Receive(byteReceiveMessage);
    string ReceiveMessage=Encoding.Default.GetString(byteReceiveMessage);
    if(InvokeRequired)
    {
    BeginInvoke(new NoticeDelegate (AddMsg),new object[]{ReceiveMessage});
    }
    }
    private void AddMsg(string msg)
    {
        this.ListBox1.Items.Add(msg);
    }注:以上代码我没有测试
      

  8.   

    事件信息最好是用参数对象传递,方便扩展
    比如说封装一个
    class CMyEventArgs : System.EventArgs
    {
    public string strRecMsg;
    public string strRecTime;
    public string strRecRemoteIP;
    }在激发事件的时候,实例化这个类if(OnConnect != null)
    {
    CMyEventArgs e = new CMyEventArgs();
    e.strRecMsg = (SOCKET接收到的消息);
    e.strRecTime = (时间);
    e.strRecRemoteIP = (远程IP);
    OnConnect(this, e);
    }
    ------------------------
    参数被传递到窗体上的时候,就可以用e来取信息了么~------------------------另:工作时候不能开QQ...
      

  9.   


    MyLf(不睡觉的鱼) ( 
    说得很正确你是在不同得线程里,你确是想操作其他线成得listbox
      

  10.   

    MyLf  我是在webform环境中调试的  在web环境中没有invoke方法是吧  那么在webform中的控件该怎么实现上面的功能 你知道吗
      

  11.   

    晕web下你用多线程显示数据结果? 不解...
      

  12.   

    唉  我也是无奈啊 老板要在web下接收服务器信息 mylf兄弟你有什么好点子没 只要能接到数据显示在listbox上就行
    你的意思是说web下不能用多线程?
      

  13.   

    kknd2005  你说的方法我已经理解了 但是不行啊 他就是显示不出数据来  你看下我的代码 帮我找找错误好吧 
    public delegate void SocketConnect(object sender,CMyEventArgs e);
    public event SocketConnect OnConnect;
    public static CMyEventArgs e;
    在窗体设计器产生的代码中添加这个事件this.OnConnect +=new WebForm1.SocketConnect(this.aaa);
    下面的是线程方法
    private void receivemessage()
    {
    while(true)
    {
    try
    {
    if(OnConnect != null)
    {  // e = new CMyEventArgs (); 
    byte[] byteReceiveMessage=new byte[100];
    MySocket.Receive(byteReceiveMessage);
    string ReceiveMessage=Encoding.Default.GetString(byteReceiveMessage);
    e.strRecMsg = ReceiveMessage;
    OnConnect(this, e);
    }
    下面的是事件方法
    private void aaa(object sender,CMyEventArgs e)
    {   
    this.ListBox1.Items.Add("a");
    this.TextBox1.Text= e.strRecMsg;
    }调试的时候e.strRecMsg收到了数据  this.ListBox1.Items.Add方法也overload了 但是就是不在页面上显示出来
      

  14.   

    如果是在网页里面使用SOCKET的话因为你的SOCKET代码实际上是在服务器运行的,等于是服务器在接收SOCKET信息,服务器接收到信息后,如果客户端不主动去获取,是得不到信息的,你可以在获取信息那个ASPX页面的HEAD里面加上:
    <meta http-equiv="refresh" content="3">
    让客户端每隔三秒去服务器端获取一次数据
      

  15.   

    楼上的kknd2005兄弟还在吗 定时刷新的方法太难看了  而且一刷的话别以前的信息都刷没了  能不能有好一点的方法啊
      

  16.   

    你是网页,没太好的办法如果想不刷新取数据,可以用XMLHTTP你就在论坛里搜一下吧,不是太难,主要是用到了JAVASCRIPT
      

  17.   

    谢谢
    你在下面的帖子后面回个小贴我好散分呵呵
    http://community.csdn.net/Expert/topic/4215/4215968.xml?temp=.6040308