C# 从单独的线程c更新listbox#

C# 从单独的线程c更新listbox#,c#,.net,multithreading,listbox,C#,.net,Multithreading,Listbox,因此,我试图根据通过本地网络接收到的一些数据更新列表框 我知道我缺少一些基本的东西。谁能解释一下我可能做错了什么?我意识到除了UI线程之外,您不能从任何线程更新UI。我想我的问题是我不知道如何指定我希望UI线程更新这些值 您可以在监视器线程中看到我试图完成的任务 namespace FrontEnd { public partial class Form1 : Form { TcpClient clientSocket = new TcpClient();

因此,我试图根据通过本地网络接收到的一些数据更新列表框

我知道我缺少一些基本的东西。谁能解释一下我可能做错了什么?我意识到除了UI线程之外,您不能从任何线程更新UI。我想我的问题是我不知道如何指定我希望UI线程更新这些值

您可以在监视器线程中看到我试图完成的任务

namespace FrontEnd
{
    public partial class Form1 : Form
    {
        TcpClient clientSocket = new TcpClient();
        //CommandQueue commandqueue;
        private List<String> COMMANDS = new List<String>();
        private object m_lock = new object();
        delegate void AddListItemDelegate(string text);

        public void enqueue(string command)
        {
            lock (m_lock)
            {
                Debug.WriteLine("Enqueue");
                COMMANDS.Add(command);
            }
        }

        public string dequeue()
        {
            lock (m_lock)
            {
                string tmp = COMMANDS.First();
                COMMANDS.RemoveAt(0);
                return tmp;
            }
        }


        public void monitor()
        { // need a better mechanism

            while (true)
            { // bad algorithm
                lock (m_lock)
                {
                    if (COMMANDS.ToArray().Length > 0)
                    { // if queue is not empty
                        do
                        { // this is okay
                            string dequeued = dequeue();
                            string command = dequeued.Split(':')[0];
                            string data = dequeued.Split(':')[1];
                            if (command.Equals("add"))
                            { // add student
                                Debug.WriteLine("adding item to listbox");

                                //lbStudents.Items.Add(data);
                                //lbStudents.Update();
                            }
                        } while (COMMANDS.ToArray().Length > 0);
                    }
                }
            }
        }

        public Form1()
        {
            InitializeComponent();
        }
        public void launchThread()
        {

            Form1 f1 = new Form1();
                        Thread oThread = new Thread(monitor);
            oThread.Start(f1);
            while (!oThread.IsAlive) ;
            Debug.WriteLine("THREAD LAUNCHED");
        }

        private void cleanResponse(string response)
        {
            string[] responses = response.Split(':');
            string command = responses[0];
            string[] data = responses.ToList().GetRange(1, responses.Length - 2).ToArray();
            for (int i=0;i<data.Length;i++)
            {
                Debug.WriteLine("thing in here debug");
                try
                {
                    enqueue(command + ':' + data[i]);
                }
                catch (Exception e)
                {
                    Debug.WriteLine("EXCEPTION: " + e);
                }
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            launchThread();
            lblStatus.Text = "Connecting...";
            clientSocket.Connect("10.108.45.120", 9001);
            Stream stm = clientSocket.GetStream();
            byte[] ba = new ASCIIEncoding().GetBytes("start");
            stm.Write(ba, 0, ba.Length);
            byte[] bb = new byte[100];
            lblStatus.Text = "Connected!";
            stm.Read(bb, 0, bb.Length);
            string response = System.Text.ASCIIEncoding.UTF8.GetString(bb);
            cleanResponse(response);
            clientSocket.Close();
            grpbxSparseMatrix.ForeColor = Color.White;
        }
    }
}
名称空间前端
{
公共部分类Form1:Form
{
TcpClient clientSocket=新的TcpClient();
//命令队列命令队列;
私有列表命令=新列表();
私有对象m_lock=新对象();
委托无效AddListItemDelegate(字符串文本);
公共void排队(string命令)
{
锁(m_锁)
{
Debug.WriteLine(“排队”);
命令。添加(命令);
}
}
公共字符串出列()
{
锁(m_锁)
{
字符串tmp=COMMANDS.First();
命令.RemoveAt(0);
返回tmp;
}
}
公共空间监视器()
{//需要一个更好的机制
while(true)
{//坏算法
锁(m_锁)
{
if(COMMANDS.ToArray().Length>0)
{//如果队列不是空的
做
{//这没关系
string dequeued=dequeue();
string命令=dequeued.Split(“:”)[0];
string data=dequeued.Split(“:”)[1];
if(command.Equals(“add”))
{//添加学生
Debug.WriteLine(“将项添加到列表框”);
//lbStudents.Items.Add(数据);
//lbStudents.Update();
}
}while(COMMANDS.ToArray().Length>0);
}
}
}
}
公共表格1()
{
初始化组件();
}
public void launchThread()
{
Form1 f1=新Form1();
线程oThread=新线程(监视器);
启动(f1);
而(!oThread.IsAlive);
Debug.WriteLine(“线程启动”);
}
私有空响应(字符串响应)
{
string[]responses=response.Split(“:”);
字符串命令=响应[0];
string[]data=responses.ToList().GetRange(1,responses.Length-2.ToArray();

对于(inti=0;i使用非UI线程的BeginInvoke

Action<string> add = str => {
    lbStudents.Items.Add(str);
}

BeginInvoke(add, data);
Action add=str=>{
lbStudents.Items.Add(str);
}
开始记录(添加、数据);

这就是他们创建BackGroundWorker的原因,这样你就不会伤脑筋了如何自己编写线程谢谢你的帮助!