大致代码如下
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);
}
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);
}
private void receivemessage()
{
while(true)
{
//byte[] byteReceiveMessage=new byte[100];
//MySocket.Receive(byteReceiveMessage);
//string ReceiveMessage=Encoding.Default.GetString(byteReceiveMessage);
this.listBox1.Items.Add("aaa");
}
}
2:封装继承自System.EventArgs的消息参数类,传递接收到的消息SOCKET接收消息----实例化参数类对象(假设是e)----激发事件,把e作为事件参数传递窗体注册该SOCKET类事件----在事件处理代码中进行处理
//声明代表
public delegate void SocketConnect(object sender,EventArgs e);
//申明事件
public event SocketConnect OnConnect;在委托方法中private void receivemessage()中
this.OnConnect +=new WebForm3.SocketConnect(this.socket_Connect);
然后又写了个方法对窗体进行操作
private void receivemessage()中用if(OnConnect != null)
{
实例化 e-----在e的类定义中要能包含足够的信息,比如说Socket接收到的字符串
OnConnect(this, e);
}
然后在窗体的代码中
CMySocket pCMySocket;pCMySocket.OnConnect += new SocketConnect(this.aaa); ----在这里按TAB就可以了
然后在函数aaa中写你自己的处理代码
是你使用了多线程的原因。
你是在创建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);
}注:以上代码我没有测试
比如说封装一个
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...
MyLf(不睡觉的鱼) (
说得很正确你是在不同得线程里,你确是想操作其他线成得listbox
你的意思是说web下不能用多线程?
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了 但是就是不在页面上显示出来
<meta http-equiv="refresh" content="3">
让客户端每隔三秒去服务器端获取一次数据
你在下面的帖子后面回个小贴我好散分呵呵
http://community.csdn.net/Expert/topic/4215/4215968.xml?temp=.6040308