public void run()
        {
            startServer = new Thread(new ThreadStart(startUdpServer));
                  startServer.Start();
        }    private void button7_Click(object sender, EventArgs e)
        {
            run();
        }
startUdpServer函数内容如下:
                int i, j;
                byte[] receive = new byte[1200];
                byte[] realdata = new byte[256];
                ASCIIEncoding s = new ASCIIEncoding();                udp.Connect("192.168.7.69", 1969);
                IPEndPoint ipadr = new IPEndPoint(IPAddress.Parse("192.168.7.69"), 10001);
                receive = udp.Receive(ref ipadr);
                if (receive.Length > 119)
                {
                    for (i = 0; i < (int)(receive.Length / 120); i++)
                    {
                        st = "";
                        for (j = 0; j < 29; j++)
                        {
                            Array.Resize(ref realdata, 29);
                            realdata[j] = receive[i * 120 + 0x4d + j];
                        }
                        st += s.GetString(realdata);                    }
                    ListViewItem item;
                    string str = textBox1.Text;
                    ddd = 1;
                    if (listView1.Items.Count < 1)// 如果 listview上的记录为空 则添加一个记录;
                    {
                        item = new ListViewItem(ddd.ToString());
                        item.SubItems.Add(st);
                        item.SubItems.Add("1");
                        listView1.Items.Add(item);
                        int aaa = listView1.Items.Count;
                    }
                    else             
                    {
                        for (int m = 0; m < listView1.Items.Count; m++)   
                        {
                            if (st == Convert.ToString(listView1.Items[m].SubItems[1].Text))
                            {
                             
                                //如果 新的内容 str,和 listview上的记录行 相同 则做
                                ttt = m;
                                kkk = kkk + 1;
                            }
                            else   //如果  listview 上 tag  列的内容和 str 不相等
                            {
                                kkk = 0;
                            }
                        }                        if (kkk == 0)      //如果没有相同的记录则做如下操作,添加新的一条记录;
                        {
                            ddd = ddd + 1;
                            item = new ListViewItem(ddd.ToString());
                            item.SubItems.Add(st);
                            item.SubItems.Add("1");
                            listView1.Items.Add(item);
                        }
                        else    //若记录相等 则给listview 上的 times 列 的加“1”;
                        {
                            listView1.Items[ttt].SubItems[2].Text = Convert.ToString((Convert.ToInt32(listView1.Items[ttt].SubItems[2].Text) + 1));
                        }
                    }
                }            }问题出现在startUdpServer函数 因为listview 这个控件吧Cross-thread operation not valid: control'listview' accessed from a thead
other than thread it was create on.还是这个问题 顶的有分   愁死我了

解决方案 »

  1.   

    TO LIUJIA没写错啊   其实显示的有三列内容  ID  TAG  TIMES"subItems[2]" 是次数啊,  意思是: 如果读到卡和每一行的卡号比较
     比较后确定相同 "subItems[2]" 上就加"1" 次不同 就另起一行的item = new ListViewItem(ddd.ToString());这个也是一列
    下面是 初始代码   int ttt;
            int kkk;
            int ddd;
     listView1.View = View.Details;
                // Add a column with width 20 and left alignment.
                listView1.Columns.Add("ID", 30, HorizontalAlignment.Left);
                listView1.Columns.Add("Tag", 120, HorizontalAlignment.Left);
                listView1.Columns.Add("Times", 50, HorizontalAlignment.Left);
                listView1.Columns.Add("Memo", 50, HorizontalAlignment.Left);
      

  2.   

    問題很明顯,應把listview放在線程外面定義
      

  3.   

    是你的在线程中操作UI部分,这是不允许的,需要用Invoke或者begininvoke来操作。
    参看
    http://blog.csdn.net/Knight94/archive/2006/08/24/1111267.aspx
      

  4.   

    大致的思路就是定义一个委托,然后在线程中用Invoke去处理
    public delegate void SetItemValue( string ItemText );
    private void SetItem( string ItemText)
    {
         yourListView.Items[0].Text = ItemText;
    }//in your thread function
    SetItemValue mySet = new SetItemValue( SetItem );
    this.Invoke( mySet, new object[]{ "test" } );
      

  5.   

    大致帮你改了一下,写得有点复杂:
    两个委托:
    public delegate void MyInvoke1(int id);//用于对相同的项增加次数
    public delegate void MyInvoke2(int id,string st);//用于增加新的项两个函数:private void CreateNewItem(int id, string st)
            {
                //添加一个新的项
                ListViewItem item = new ListViewItem(id.ToString());
                item.SubItems.Add(st);
                item.SubItems.Add("1");
                listView1.Items.Add(item);
                int aaa = listView1.Items.Count;           
            }
    private void UpdateItemTimes(int id)
            {
                //将出现相同的项次数增1
                listView1.Items[id].SubItems[2].Text = Convert.ToString((Convert.ToInt32(listView1.Items[ttt].SubItems[2].Text) + 1));
            }你的代码:
    if (receive.Length > 119)
                {
                    for (i = 0; i < (int)(receive.Length / 120); i++)
                    {
                        st = "";
                        for (j = 0; j < 29; j++)
                        {
                            Array.Resize(ref realdata, 29);
                            realdata[j] = receive[i * 120 + 0x4d + j];
                        }
                        st += s.GetString(realdata);                }                ListViewItem item;
                    string str = textBox1.Text;
                    ddd = 1;
                    if (listView1.Items.Count < 1)// 如果 listview上的记录为空 则添加一个记录;
                    {
                         //改的地方1
                        //item = new ListViewItem(ddd.ToString());
                        //item.SubItems.Add(st);
                        //item.SubItems.Add("1");
                        //listView1.Items.Add(item);
                        //int aaa = listView1.Items.Count;
                        MyInvoke2 mi = new MyInvoke2(CreateNewItem);
                        this.BeginInvoke(mi, new object[] { ddd, st });
                    }
                    else
                    {
                        for (int m = 0; m < listView1.Items.Count; m++)
                        {
                            if (st == Convert.ToString(listView1.Items[m].SubItems[1].Text))
                            {                            //如果 新的内容 str,和 listview上的记录行 相同 则做
                                ttt = m;
                                kkk = kkk + 1;
                            }
                            else   //如果  listview 上 tag  列的内容和 str 不相等
                            {
                                kkk = 0;
                            }
                        }                    if (kkk == 0)      //如果没有相同的记录则做如下操作,添加新的一条记录;
                        {
                            ddd = ddd + 1;
                            //改的地方2
                            //item = new ListViewItem(ddd.ToString());
                            //item.SubItems.Add(st);
                            //item.SubItems.Add("1");
                            //listView1.Items.Add(item);
                            MyInvoke2 mi = new MyInvoke2(CreateNewItem);
                            this.BeginInvoke(mi, new object[] { ddd, st });
                        }
                        else    //若记录相等 则给listview 上的 times 列 的加“1”;
                        {
                            //改的地方3
                            //listView1.Items[ttt].SubItems[2].Text = Convert.ToString((Convert.ToInt32(listView1.Items[ttt].SubItems[2].Text) + 1));
                            MyInvoke1 mi = new MyInvoke1(UpdateItemTimes);
                            this.BeginInvoke(mi, new object[] {ttt});
                        }
                    }
                }共有三处改的地方。楼主根据需要可以再自行修改一下,我没有测试,楼主自己试一下吧。
      

  6.   

    谢谢各位这个最后应该在 Microsoft BizTalk2006 里出现地
    界面是不用的  我只是想自己测试 DLL 这个RFID中间件是否真确
    我去掉listview 看断点 看的结果了 可能还有点问题请大家多指教  刚接触C# 也是公司临时安排的 没办法 麻烦各位了
      

  7.   

    TO
    liujia_0421() 
    今天没时间了 换办公室要 搬楼下 呵呵周一来试试再  基本的协议 都封装差不多了 如果没问题的话 下月去MS 再做进一步开发
    再次谢谢各位的帮助
      

  8.   

    ……最常见的线程问题,在UI线程外操作UI线程创建的控件
    用委托来做吧
      

  9.   


    namespace WindowsApplication1
    {
        public partial class Form1 : Form
        {
            int ttt;
            int kkk;
            int ddd;
            ListViewItem item;
            
            Thread startServer;
          //  int i;
            public Form1()
            {
                InitializeComponent();            listView1.View = View.Details;
                // Add a column with width 20 and left alignment.
                listView1.Columns.Add("ID", 30, HorizontalAlignment.Left);
                listView1.Columns.Add("Tag", 120, HorizontalAlignment.Left);
                listView1.Columns.Add("Times", 50, HorizontalAlignment.Left);
                listView1.Columns.Add("Memo", 50, HorizontalAlignment.Left);
            }        private void button1_Click(object sender, EventArgs e)
            {
               while (true)
                {
                    run();
                }
                          
            }
            public void run()
            {
                startServer = new Thread(new ThreadStart(startUdpServer));
               
                startServer.Start();
            }
            public void startUdpServer()
            {
                try
                {
                                      
                        string st = "aaaa";
                        ddd = 1;                  
                        if (listView1.Items.Count < 1)// 如果 listview上的记录为空 则添加一个记录;
                        {
                            item = new ListViewItem(ddd.ToString());
                            item.SubItems.Add(st);
                            item.SubItems.Add("1");
                            listView1.Items.Add(item);
                            int aaa = listView1.Items.Count;
                        }
                        else             
                        {
                            for (int m = 0; m < listView1.Items.Count; m++)   
                            {
                                if (st == Convert.ToString(listView1.Items[m].SubItems[1].Text))
                                {
                                    //如果 新的内容 str,和 listview上的记录行 相同 则做
                                    ttt = m;
                                    kkk = kkk + 1;
                                }
                                else   //如果  listview 上 tag  列的内容和 str 不相等
                                {
                                    kkk = 0;
                                }
                            }                        if (kkk == 0)      //如果没有相同的记录则做如下操作,添加新的一条记录;
                            {
                                ddd = ddd + 1;
                                item = new ListViewItem(ddd.ToString());
                                item.SubItems.Add(st);
                                item.SubItems.Add("1");
                                listView1.Items.Add(item);
                            }
                            else    //若记录相等 则给listview 上的 times 列 的加“1”;
                            {
                                listView1.Items[ttt].SubItems[2].Text = Convert.ToString((Convert.ToInt32(listView1.Items[ttt].SubItems[2].Text) + 1));
                            }
                        }
                    // }            }
                catch (Exception error)
                {
                    MessageBox.Show(error.Message);
                }
            }
        }
    }我把真实的卡号去掉了, ST="aaaa"  用这个做为卡号
    那位哥们 喝茶时间帮搞下  不是我懒 实在是摸不到门道
      

  10.   

    帮LZ顶,
    PS:愚翁确实有蛮吊哦!也顺便顶他一下
    最后接分,哈哈
      

  11.   

    to: 我把真实的卡号去掉了, ST="aaaa"  用这个做为卡号
    没大明白,能否说得再详细点...
      

  12.   

    http://www.eimhe.com/bbs/adget.php?id=379765美河学习在线——专业视频课程下载基地
      

  13.   

    的确,你应该把listview放到线程外,用一个线程专门完成对控件的修改,别的线程想更改控件的要向这个线程发消息.
      

  14.   

    to: 我把真实的卡号去掉了, ST="aaaa"  用这个做为卡号
    没大明白,能否说得再详细点...
      

  15.   

    代码真多,没看完,不过给你提个思路在一个线程中操作另一个线程一般来说是不允许的,可以使用基于事件的异步后台线程来处理数据,在事件中向调用线程(有控件的线程)报告处理结果等各种需要报告的东西,MSDN有详细讲解,可以在本地MSDN中搜索“基于事件的异步模式组件”,它手把手教你如何建立、使用
      

  16.   

    使用基于事件的异步模式进行多线程编程
    ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.chs/dv_fxadvance/html/958d6617-5e70-4b36-b5db-63c16dc35e43.htm在IE中输入以上网址,就出来了
      

  17.   

    1。触发事件
    2。只有脱离线程,才能控制你的listview
      methodXXXX mk =new methodXXX(委托方法名)
       this.invoke(委托方法名)
    具体的忘记了,单词不会呵呵
      

  18.   

    这是一个网吧管理系统。
    首先在SQL里用getdate()得到当前登陆时间,然后以预存金额与所定义的时段收费(时段收费是在另一张表中,有二十四个字段,从零到二十三,里面记录了每个小时的收费标准)进行减运算,逐一相减,比如20块,现在时间为晚上八点,那么就是20-八点收费标准-九点收费标准以此类推,直到小于或等于1,然后用余数与下一个时段收费标准进行相除,得出所能上网的时长,精确到分,然后与当前登陆时间进行相加,然后得出预计下机时间。
    第一个做出来的送分一百,只能在SQL里完成,不能使用其它代码,当然如果有JAVA代码或者C#代码作参考,会补送一些补偿分。请高手帮忙! 顶顺便说一下我的问题,贴子在C#专区。一百分,在线等
      

  19.   

    to:liujia 我把真实的卡号去掉了, ST="aaaa"  用这个做为卡号
    没大明白,能否说得再详细点...因为你没真实的设备 读不到卡 ,ST="aaaa" 这个算虚拟的卡号
    如过你把代码建立个简单的工程 就可以在listview上看 aaaa 这个虚拟卡号不断增加
    不用真实的去连接设备读卡了
      

  20.   

    CheckForIllegalCrossThreadCalls = false;     加这个在构造函数里
     private void button7_Click(object sender, EventArgs e)
            {
                run();
            }run() 这样写能显示 一次但 这样写
     private void button7_Click(object sender, EventArgs e)
            { 
               while
             {
                run();
              }
            }就啥也没有了
      

  21.   

    测试程序如下:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;namespace TestListView
    {
        public partial class TestListView : Form
        {
            private Thread startServer;
            public delegate void MyInvoke1(int id);//用于对相同的项增加次数
            public delegate void MyInvoke2(int id, string st);//用于增加新的项
            int ttt;
            int kkk;
            int ddd;
            string subItemText;
                    private void CreateNewItem(int id, string st)
            {
                //添加一个新的项
                ListViewItem item = new ListViewItem(id.ToString());
                item.SubItems.Add(st);
                item.SubItems.Add("1");
                listView1.Items.Add(item);
                int aaa = listView1.Items.Count;
            }        private void UpdateItemTimes(int id)
            {
                //将出现相同的项次数增1
                listView1.Items[id].SubItems[2].Text = Convert.ToString((Convert.ToInt32(listView1.Items[ttt].SubItems[2].Text) + 1));
            }        private void  GetSubItemText(int index)
            {
                //得到子项的值
                subItemText=Convert.ToString(listView1.Items[index].SubItems[1].Text);
            }
            public TestListView()
            {
                InitializeComponent();
                ttt=0;
                kkk=0;
                ddd=1;
            }        public void run()
            {
                startServer = new Thread(new ThreadStart(startUdpServer));
                startServer.Start();
            }        private void btnTest_Click(object sender, EventArgs e)
            {
                run();
            }
            private void startUdpServer()
            {
                for (int iii = 0; iii < 10; iii++)
                {
                    //ListViewItem item;
                    //string str = textBox1.Text;
                    string st = "aaaa";
                    //ddd = 1;                if (listView1.Items.Count < 1)// 如果 listview上的记录为空 则添加一个记录;
                    {
                        //改的地方1
                        //item = new ListViewItem(ddd.ToString());
                        //item.SubItems.Add(st);
                        //item.SubItems.Add("1");
                        //listView1.Items.Add(item);
                        //int aaa = listView1.Items.Count;
                        MyInvoke2 mi = new MyInvoke2(CreateNewItem);
                        this.BeginInvoke(mi, new object[] { ddd, st });
                    }
                    else
                    {
                        for (int m = 0; m < listView1.Items.Count; m++)
                        {
                            MyInvoke1 mi = new MyInvoke1(GetSubItemText);
                            //string str = Convert.ToString ( );
                            this.BeginInvoke(mi, new object[] { m });
                            if (st == subItemText )
                            {                            //如果 新的内容 str,和 listview上的记录行 相同 则做
                                ttt = m;
                                kkk = kkk + 1;
                            }
                            else   //如果  listview 上 tag  列的内容和 str 不相等
                            {
                                kkk = 0;
                            }
                        }                    if (kkk == 0)      //如果没有相同的记录则做如下操作,添加新的一条记录;
                        {
                            ddd = ddd + 1;
                            //改的地方2
                            //item = new ListViewItem(ddd.ToString());
                            //item.SubItems.Add(st);
                            //item.SubItems.Add("1");
                            //listView1.Items.Add(item);
                            MyInvoke2 mi = new MyInvoke2(CreateNewItem);
                            this.BeginInvoke(mi, new object[] { ddd, st });
                        }
                        else    //若记录相等 则给listview 上的 times 列 的加“1”;
                        {
                            //改的地方3
                            //listView1.Items[ttt].SubItems[2].Text = Convert.ToString((Convert.ToInt32(listView1.Items[ttt].SubItems[2].Text) + 1));
                            MyInvoke1 mi = new MyInvoke1(UpdateItemTimes);
                            this.BeginInvoke(mi, new object[] { ttt });
                        }
                    }
                }        }    }
    }输出为:
    ID   Tag   Times  Memo
    1   aaaa        10
      

  22.   

    稍微修改一下:
    将string st = "aaaa";修改为:
    string st = "aaaa"+iii.ToString ();即:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;namespace TestListView
    {
        public partial class TestListView : Form
        {
            private Thread startServer;
            public delegate void MyInvoke1(int id);//用于对相同的项增加次数
            public delegate void MyInvoke2(int id, string st);//用于增加新的项
            int ttt;
            int kkk;
            int ddd;
            string subItemText;
                    private void CreateNewItem(int id, string st)
            {
                //添加一个新的项
                ListViewItem item = new ListViewItem(id.ToString());
                item.SubItems.Add(st);
                item.SubItems.Add("1");
                listView1.Items.Add(item);
                int aaa = listView1.Items.Count;
            }        private void UpdateItemTimes(int id)
            {
                //将出现相同的项次数增1
                listView1.Items[id].SubItems[2].Text = Convert.ToString((Convert.ToInt32(listView1.Items[ttt].SubItems[2].Text) + 1));
            }        private void  GetSubItemText(int index)
            {
                //得到子项的值
                subItemText=Convert.ToString(listView1.Items[index].SubItems[1].Text);
            }
            public TestListView()
            {
                InitializeComponent();
                ttt=0;
                kkk=0;
                ddd=1;
            }        public void run()
            {
                startServer = new Thread(new ThreadStart(startUdpServer));
                startServer.Start();
            }        private void btnTest_Click(object sender, EventArgs e)
            {
                run();
            }
            private void startUdpServer()
            {
                for (int iii = 0; iii < 10; iii++)
                {
                    //ListViewItem item;
                    //string str = textBox1.Text;
                    string st = "aaaa"+iii.ToString ();
                    //ddd = 1;                if (listView1.Items.Count < 1)// 如果 listview上的记录为空 则添加一个记录;
                    {
                        //改的地方1
                        //item = new ListViewItem(ddd.ToString());
                        //item.SubItems.Add(st);
                        //item.SubItems.Add("1");
                        //listView1.Items.Add(item);
                        //int aaa = listView1.Items.Count;
                        MyInvoke2 mi = new MyInvoke2(CreateNewItem);
                        this.BeginInvoke(mi, new object[] { ddd, st });
                    }
                    else
                    {
                        for (int m = 0; m < listView1.Items.Count; m++)
                        {
                            MyInvoke1 mi = new MyInvoke1(GetSubItemText);
                            //string str = Convert.ToString ( );
                            this.BeginInvoke(mi, new object[] { m });
                            if (st == subItemText )
                            {                            //如果 新的内容 str,和 listview上的记录行 相同 则做
                                ttt = m;
                                kkk = kkk + 1;
                            }
                            else   //如果  listview 上 tag  列的内容和 str 不相等
                            {
                                kkk = 0;
                            }
                        }                    if (kkk == 0)      //如果没有相同的记录则做如下操作,添加新的一条记录;
                        {
                            ddd = ddd + 1;
                            //改的地方2
                            //item = new ListViewItem(ddd.ToString());
                            //item.SubItems.Add(st);
                            //item.SubItems.Add("1");
                            //listView1.Items.Add(item);
                            MyInvoke2 mi = new MyInvoke2(CreateNewItem);
                            this.BeginInvoke(mi, new object[] { ddd, st });
                        }
                        else    //若记录相等 则给listview 上的 times 列 的加“1”;
                        {
                            //改的地方3
                            //listView1.Items[ttt].SubItems[2].Text = Convert.ToString((Convert.ToInt32(listView1.Items[ttt].SubItems[2].Text) + 1));
                            MyInvoke1 mi = new MyInvoke1(UpdateItemTimes);
                            this.BeginInvoke(mi, new object[] { ttt });
                        }
                    }
                }        }    }
    }输出如下:
    ID   Tag   Times   Memo
    1    aaaa0      1
    2    aaaa1      1
    3    aaaa2      1
    4    aaaa3      1
    5    aaaa4      1
    6    aaaa5      1
    7    aaaa6      1
    8    aaaa7      1
    9    aaaa8      1
    10   aaaa9      1
      

  23.   

    输出为:
    ID   Tag   Times  Memo
    1   aaaa        10我要的是这种  谢谢你兄弟留个MSN 吧  我觉得以后这个BizTalk2006 这个RFID中间件 
    开发中还会有不少问题,希望能多指教
      

  24.   

    TO LIUJIA输出为:
    ID   Tag   Times  Memo
    1   aaaa        10你的输出为这个结果的 代码中   startUdpServer()在这个函数里用了 10次的循环啊输出的效果是对的,但方法不是想要的
    我想的是把下面的BUTTON里代码
       private void btnTest_Click(object sender, EventArgs e)
            {
                run();
            }改为
      private void btnTest_Click(object sender, EventArgs e)
            {
             while(ture)
             {
               run();
              }
            }
    让这个startUdpServer()的线程一直运行  能成么?我改了 但程序死了
      

  25.   

    private void btnTest_Click(object sender, EventArgs e)
            {
             while(ture)
             {
               run();
              }
            }
    让这个startUdpServer()的线程一直运行  能成么?
    这是死循环,程序当然会死掉啊....
      

  26.   

    噢 了解
    那和MCU程序不一样啊while(ture)
             {
               run();
              }就是这样个大循环的啊 程序一直工作那C# 有什么办法让这个线程 一直工作 或 间隔100ms工作一次?
      

  27.   

    谢谢你 AWEN   TIMER 的我试过了是可以的 呵呵 可以定时刷新的
    同时也不存在 这个问题 就是交叉线程  按MS专家的意思 一定要用线程
    不行去北京再说了