线程池回调方法传数据到UI的listbox控件
在论坛里看见diaodiaop高人回复的关于socket一个服务器端连多个客户端的控制台代码,经测试很好。现在要改成窗体程序,本人初学,始终不能把接收到的数据传给listbox控件,已经搞了3天,还是不行。现请教各位高人,应该怎样做,谢谢!代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net.Sockets;
using System.Threading;
namespace socket一对多通信
{
class Program
{
static byte[] buffer = new byte[1024];
static void Main(string[] args)
{
try
{
Dictionary<string, int> server = new Dictionary<string, int>();
server.Add("192.168.53.53", 4999);
server.Add("192.168.53.54", 4998);
server.ToList().AsParallel().ForAll(item =>
{
Console.WriteLine("con");
var client = new TcpClient();
client.Connect(item.Key, item.Value);
client.Client.BeginReceive(buffer, 0, buffer.Length, System.Net.Sockets.SocketFlags.None, new AsyncCallback(ReceiveMessage), client);
});
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
static void ReceiveMessage(IAsyncResult ar)
{
var socket = ar.AsyncState as TcpClient;
try
{
var length = socket.Client.EndReceive(ar);
byte[] reallData = new byte[length];
Array.Copy(buffer, reallData, length);
ThreadPool.QueueUserWorkItem(new WaitCallback((state) => { doWork(new objectState() { s = socket, data = reallData }); }));
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
socket.Client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReceiveMessage), socket);
}
}
static void doWork(object o)
{
DateTime dt = DateTime.Now;
var rs = o as objectState;
var a = string.Join("-", rs.data.Select(d => d.ToString("X2")).ToArray());
Console.WriteLine(dt + " " + rs.s.Client.RemoteEndPoint.ToString() + " 当前线程ID: " + Thread.CurrentThread.ManagedThreadId);//获取连接的服务器端的IP和PORT 获取当前线程的标识符ID
Console.WriteLine(a);
//Console.WriteLine(Thread.CurrentThread.ThreadState);//获取当前线程的类型,后台线程,还是其他
}
}
public class objectState
{
public TcpClient s { get; set; }
public byte[] data { get; set; }
}
}