namespace WindowsApplication1
{
    public partial class Form1 : Form
    {
        static Socket serverSock;
        static AsyncCallback receiveCallback;
        static byte[] buff;
        static EndPoint senderIP;
        delegate void OnReceiveplayer(string text);
        static int count=0;
       
        private void Form1_Load(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
           
        }        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
         
            //异步
            buff = new byte[1024];
            senderIP = new IPEndPoint(IPAddress.Any, 0);            receiveCallback = new AsyncCallback(OnDataReceived);            serverSock = new Socket(AddressFamily.InterNetwork,
            SocketType.Dgram, ProtocolType.Udp);
            serverSock.Bind(new IPEndPoint(IPAddress.Any, 9050));
            serverSock.BeginReceiveFrom(buff, 0, buff.Length, SocketFlags.None,
            ref   senderIP, receiveCallback, serverSock);            //Console.ReadLine(); 
        }        private void button1_Click(object sender, EventArgs e)
        {            
            Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,
               ProtocolType.Udp);
            IPEndPoint iep1 = new IPEndPoint(IPAddress.Broadcast, 9050);//255.255.255.255
            //IPEndPoint iep2 = new IPEndPoint(IPAddress.Parse("192.168.1.255"), 9050);
            //string hostname = Dns.GetHostName();
            string sendmsg = "005003,005,45-45-54-54-ac-4A,online";
            byte[] data = Encoding.UTF8.GetBytes(sendmsg);
            sock.SetSocketOption(SocketOptionLevel.Socket,
                       SocketOptionName.Broadcast, 1);
            sock.SendTo(data, iep1);
            //sock.SendTo(data, iep2);
            sock.Close();        }
        private void OnDataReceived(IAsyncResult ar)
        {
            Socket udpSocket = ar.AsyncState as Socket;
            int bytesRecved = udpSocket.EndReceiveFrom(ar, ref   (EndPoint)senderIP);            //Console.WriteLine("{0}传来消息{1} ", senderIP.ToString(), System.Text.Encoding.ASCII.GetString(buff, 0, bytesRecved));
            //MessageBox.Show("{0}传来消息{1} "+ senderIP.ToString() +" "+ System.Text.Encoding.ASCII.GetString(buff, 0, bytesRecved));            this.OnReceiveplayerd(System.Text.Encoding.UTF8.GetString(buff, 0, bytesRecved));                     serverSock.BeginReceiveFrom(buff, 0, buff.Length, SocketFlags.None,
            ref  senderIP, receiveCallback, serverSock);
        }
                       private void OnReceiveplayerd(string text)
        {
            //listView1.Items.Clear();
            if (this.listView1.InvokeRequired)
            {
                OnReceiveplayer d = new OnReceiveplayer(OnReceiveplayerd);
                this.Invoke(d, new object[] { text });
            }
            else
            {
                //分割收到的信息
                count++;
                string[] tmpstr = text.Split(',');
                if (tmpstr.Length == 4)
                {
                    ListViewItem li1 = new ListViewItem();
                    li1.SubItems[0].Text = tmpstr[0];
                    li1.SubItems.Add(tmpstr[1]);
                    li1.SubItems.Add(tmpstr[2]);
                    li1.SubItems.Add(tmpstr[3]);
                    listView1.Items.Add(li1);
                }
                else
                {
                    ListViewItem li1 = new ListViewItem();
                    li1.SubItems[0].Text = tmpstr[0];
                    listView1.Items.Add(li1);
                }
                label1.Text = count.ToString();
            }
        }       
                private void buttonGetIndices_Click(object sender, EventArgs e)
        {
            System.Timers.Timer t = new System.Timers.Timer(1000);
            t.Elapsed += new System.Timers.ElapsedEventHandler(t_Elapsed);
            t.AutoReset = true;
            t.Enabled = true;
            //listView1.CheckedIndices 
        }        void t_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {            int num = 0;
            foreach (ListViewItem item in listView1.Items)
            {
                if ((item != null) && item.Selected)
                {
                    num++;
                }
            }
            //return num;
            MessageBox.Show("");
        }
        //System.Windows.Forms.ListView.CheckedIndexCollection checked_indices = (System.Windows.Forms.ListView.CheckedIndexCollection)listView1.Invoke(new cichandler(ToGetCheckedIndices));//ok
        delegate System.Windows.Forms.ListView.CheckedIndexCollection cichandler();
        System.Windows.Forms.ListView.CheckedIndexCollection ToGetCheckedIndices() {
            if (listView1.InvokeRequired)
            {
                cichandler cic = new cichandler(ToGetCheckedIndices);
                cic.Invoke();
            }
            return listView1.CheckedIndices;
        }        delegate int GetCheckedCountHandler();
        int GetCheckedCount() {
            /* int count = new GetCheckedCountHandler(GetCheckedCount).Invoke();
            throw: 未处理 System.StackOverflowException
             */
            if (listView1.InvokeRequired)
            {
                GetCheckedCountHandler counter = new GetCheckedCountHandler(GetCheckedCount);
                counter.Invoke();
            }            return listView1.CheckedIndices.Count ;
        
        }
        public int CheckedIndicesCount(ListView lv)
        {            if (!lv.CheckBoxes)
            {
                return 0;
            }
            int num = 0;
            foreach (ListViewItem item in lv.Items)
            {
                if ((item != null) && item.Checked)
                {
                    num++;
                }
            }
            return num;             
        }
        delegate int SelectedIndicesHandler(ListView listview);
        public int SelectedIndicesCount(ListView lv)
        {
            if (lv.InvokeRequired) {
                SelectedIndicesHandler selectedhandler = new SelectedIndicesHandler(SelectedIndicesCount);
                selectedhandler.Invoke(lv);            
            }            int num = 0;
            foreach (ListViewItem item in lv.Items)
            {
                if ((item != null) && item.Selected)
                {
                    num++;
                }
            }
            return num;
        }
        delegate ListView.ListViewItemCollection ListViewItemsHandler(ListView listview);
        ListView.ListViewItemCollection ListViewItems(ListView lv) {
            if (lv.InvokeRequired) {
                /* System.StackOverflowException
                ListViewItemsHandler getitems = new ListViewItemsHandler(ListViewItems);
                ListView.ListViewItemCollection items = getitems.Invoke(listView1);
                */
                ListViewItemsHandler getitems = new ListViewItemsHandler(ListViewItems);
                getitems.Invoke (lv);
            }
            return lv.Items;        
        }
    }
}简单说就是解决invoke时产生StackOverflowException

解决方案 »

  1.   

    System.Windows.Forms.ListView.CheckedIndexCollection ToGetCheckedIndices()
    {
        ListView listView1 = null;
        if (listView1.InvokeRequired)
        {
            cichandler cic = new cichandler(ToGetCheckedIndices);
            return cic.Invoke();
        }
        return listView1.CheckedIndices;
    }
      

  2.   

    这句
    int bytesRecved = udpSocket.EndReceiveFrom(ar, ref  (EndPoint)senderIP);
    中的
    ref  (EndPoint)senderIP
    不能通过吧???
      

  3.   

    System.Windows.Forms.ListView.CheckedIndexCollection ToGetCheckedIndices() 

        ListView listView1 = null; 
        if (listView1.InvokeRequired) 
        { 
            cichandler cic = new cichandler(ToGetCheckedIndices); 
            return cic.Invoke(); 
        } 
        return listView1.CheckedIndices; 
    }
    ------------------------------------
      

  4.   


     return cic.Invoke(); 貌似不用
    我运行时能获得结果,必须把程序跑起来,就是在委托调用是出现 System.StackOverflowException
    奇怪的问题
    反编译.net类库,ListView.ListViewItemCollection ListView的Items属性确实有个循环
      

  5.   

    System.Windows.Forms.ListView.CheckedIndexCollection ToGetCheckedIndices()
    {
        if (listView1.InvokeRequired)
        {
            cichandler cic = new cichandler(ToGetCheckedIndices);
            //cic.Invoke();
            return listView1.Invoke(cic);   //<---
        }
        return listView1.CheckedIndices;
    }:) 主体错了,要用Control.Invoke来送到Control所在的UI线程执行。
      

  6.   


      delegate int IndicesHandler(ListView listview);
            public int SelectedIndicesCount(ListView lv)
            {
                if (lv.InvokeRequired)
                {
                    IndicesHandler handler = new IndicesHandler(SelectedIndicesCount);
                    return (int)lv.Invoke(handler, new object[] { lv });
                }
                ListViewItemsHandler itemshandler=new ListViewItemsHandler (ListViewItems);
                ListView.ListViewItemCollection Items = itemshandler.Invoke(lv);
                int num = 0;
                foreach (ListViewItem item in Items)//lv.Items)
                {
                    if ((item != null) && item.Checked)//Selected)
                    {
                        num++;
                    }
                }
                return num;
            }        delegate ListView.ListViewItemCollection ListViewItemsHandler(ListView listview);
            ListView.ListViewItemCollection ListViewItems(ListView lv)
            {
                if (lv.InvokeRequired)
                {
                    /* System.StackOverflowException
                    ListViewItemsHandler getitems = new ListViewItemsHandler(ListViewItems);
                    ListView.ListViewItemCollection items = getitems.Invoke(listView1);
                    */
                    ListViewItemsHandler getitems = new ListViewItemsHandler(ListViewItems);
                    return (ListView.ListViewItemCollection)lv.Invoke(getitems, new object[] { lv });
                }
                return lv.Items;
            }正解
    给分!