当前位置:编程学习 > C#/ASP.NET >>

C# 线程

有这样一个问题:
     客户端的界面中有一个 listbox 控件,一个 button 控件,listbox 控件用于循环接收数据,button 控件用于关闭界面,我把 listbox 放到一个线程中,用 while 控制使其循环接收,但是 button 控件不起作用了,我想问一下,该如何解决???谢谢
        private void close_button_Click(object sender, EventArgs e)         //关闭界面
        {
            this.Close();
        }
        private void connect_button_Click(object sender, EventArgs e)
        {
            int port = 2005;
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            //IPEndPoint  ipep = new IPEndPoint(IPAddress.Parse("192.168.1.102"), int.Parse("2005"));
            IPEndPoint ipep = new IPEndPoint(ip, port);
            client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //label.Text = "CCC";
            client.Connect(ipep);
           //label.Text = "AAA";
            
            //label.Text = "BBB";
            t = new Thread(new ThreadStart(threadp));              // 创建线程,用于jieshoushuju
            t.Start();
        } --------------------编程问答-------------------- 不起作用是什么意思,你得线程怎么写的,关闭时,线程是否还在进行 --------------------编程问答-------------------- 线程能操作控件?  用委托操作UI
--------------------编程问答-------------------- namespace client3
{
    public partial class Form1 : Form
    {
        protected Thread thread;
        Socket client;
        public Form1()
        {
            InitializeComponent();
        }
        Thread t;
        private delegate void setText();
        private void threadp()
        {
            setText d = new setText(threading);
            this.Invoke(d);
        }
        public void threading()
        {
            while (true)
            {
                
                Byte[] buffer = new Byte[2048];
                recv_textBox.Text = "";
                client.Receive(buffer, buffer.Length, SocketFlags.None);
                string chatter = System.Text.Encoding.ASCII.GetString(buffer);
                recv_listBox.Items.Add(chatter);
                recv_listBox.Refresh();                 //重绘
                recv_textBox.AppendText(chatter);
                buffer = new byte[2048];
                //System.Threading.Thread.Sleep(3333333);
            }
            t.Abort();
        }
        private void close_button_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        private void connect_button_Click(object sender, EventArgs e)
        {
            int port = 2005;
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            //IPEndPoint  ipep = new IPEndPoint(IPAddress.Parse("192.168.1.102"), int.Parse("2005"));
            IPEndPoint ipep = new IPEndPoint(ip, port);
            client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //label.Text = "CCC";
            client.Connect(ipep);
           //label.Text = "AAA";
            
            //label.Text = "BBB";
            t = new Thread(new ThreadStart(threadp));
            t.Start();
        }

        
    }
} --------------------编程问答-------------------- 进入线程后,界面就被锁死
--------------------编程问答-------------------- threadp已经在新的线程里了,你又用Invoke来调用threading,不锁死才怪。
Invoke应该在更新界面控件的时候才使用,而不是整个线程。 --------------------编程问答--------------------  client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  //label.Text = "CCC";
  client.Connect(ipep);//这句执行成功了吗?如果成功了,应当不会发生界面锁死的问题。
  //label.Text = "AAA";
    
  //label.Text = "BBB";
  t = new Thread(new ThreadStart(threadp));
  t.Start();
--------------------编程问答-------------------- threadp已经在新的线程里了,你又用Invoke来调用threading
用Invoke 更新控件应如何更新,能举个例子吗 --------------------编程问答-------------------- Invoke 更新主线程界面
试下
--------------------编程问答-------------------- 屠夫状元屠夫
我在线程中更新listbox可以,主线程中也可以,但是UI被锁死 --------------------编程问答--------------------  注意:即使你是用Invoke或者BeginInvoke,你指定的委托也是在主线程上执行的.你的ListBox再循环加入内容,也就一直在占用主线(当前你的窗体的UI线程),所以导致你的界面感觉无响应状态! --------------------编程问答-------------------- 我发现用异步线程可以,这样UI就不会锁死了 --------------------编程问答-------------------- private void connect_button_Click(object sender, EventArgs e)
        {
            int port = 2005;
            IPAddress ip = IPAddress.Parse("127.0.0.1");
            IPEndPoint ipep = new IPEndPoint(ip, port);
            client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            try
            {
                client.Connect(ipep);
            }
            catch (Exception se)
            {
                MessageBox.Show(se.ToString());
            }
            CheckForIllegalCrossThreadCalls = false;           //允许子线程刷新数据    importtant(重要)
            client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(recv), client);       //异步调用开启

        }
        public void recv(IAsyncResult ar)
        {
            //Socket
            try
            {
                int re = client.EndReceive(ar);
                recv_textBox.Text = "";
                received = Encoding.ASCII.GetString(buffer, 0, re);
                recv_textBox.AppendText(Encoding.ASCII.GetString(buffer,0,re));
                recv_listBox.Items.Add(Encoding.ASCII.GetString(buffer, 0, re));
                received = "";
            
                buffer = new byte[2048];
            
                client.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(recv), client);                  //循环接收
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString());           //打印出错误
                MessageBox.Show("服务器失踪!!!!!");
            }
        }

注:CheckForIllegalCrossThreadCalls = false;   作用是用来刷新界面的,不刷新会显得界面没有东西 --------------------编程问答--------------------
引用 11 楼  的回复:
我发现用异步线程可以,这样UI就不会锁死了

异步的只是解决了 
 private void threadp()
  {
  setText d = new setText(threading);
  this.Invoke(d);
  }
  使这个函数没有被阻塞.你用BeginIovke只是在另一个线程中调用Ivoke,但是最终还是会在主线程中执行你的代码.....不知到你能否接受.哎! --------------------编程问答-------------------- 我试过了,接受不是问题。在接受时,点击界面上的 close 按键时,界面可以关闭 --------------------编程问答--------------------    界面当然可以关闭...整个窗体的动作是个消息泵....不是说你做法不能解决问题...我在讲Invoke和BeginInvoke....可能我理解错了...没什么的...我只是突然想来回答个问题赚下东西!!呵呵.
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,