private void buttonX1_Click(object sender, EventArgs e)
        {
            int i = 0;
            foreach (GridRow row in superGridControl1.PrimaryGrid.FlatVisibleRows)
            {
                Thread t = new Thread(DeTest);
                t.Start(row);
                i++;
            }
        }        private delegate void DelegateMain(object obj);        private void DeTest(object obj)
        {
            DelegateMain caller = new DelegateMain(TestBody);
            caller.BeginInvoke(obj, null, null);
        }        private void TestBody(object obj)
        {
            GridRow row = obj as GridRow;
            for (int i = 0; i < 20; i++)
            {
                row.Cells["LabelX"].Value = "test" + i;
                Application.DoEvents();
                Thread.Sleep(1000);
            }
        }
有点闹不明白了。一会执行成功。一会提示线程间访问无效。。
。实现的样子是。循环列表。然后同时每行执行大量的任务,并同时显示结果。

解决方案 »

  1.   

    你使用了多线程,.NET 中是不允许线程之间相互访问的,这个你可以使用委托回调的方式来实现,关于更多多线程的问题可以参考我的文章系列: C#多线程处理系列,因为你创建的GridRow是主线程中创建的,然而你却要在后台线程中对其进行访问,当然就会出现你说的异常的,你可以在这篇文章中的 "在线程中访问另一个线程创建的控件"部分找到解决方案
      

  2.   

    本来刷地一下子执行1000行,你现在整1000个子线程、而且每当处理一行都要调用
                    Application.DoEvents();
                    Thread.Sleep(1000);
    那么你还搞什么子线程?
      

  3.   

    就算退一万步说,假设问我如何尽量保留的代码的那种味道而仅仅让它稍微可行,我顶多可以建议你:每100行放在一起执行一个类似TestBody的方法,而且删掉上面那两行代码。
      

  4.   

    主要就是实现DATAGRIDVIEW里的每行。去分别去执行任务。然后每行即时显示执行结果。
    能给个例子吗。分都给你啦
      

  5.   

    无论是WinForm还是WPF的界面,建议你以数据绑定的方式使用GridView。
    这样会免除很多跨线程处理数据的问题,而且你这个问题也好解决。
      

  6.   

    其实浪费你们这么多时间的像你们这种大神给我写个简单的例子,最直观啦
    浪费您3分钟的时间。
    看不懂就是我的问题啦就是个LISTVIEW,循环所有行,
    然后每行同时去执行多个任务。然后把每个任务的结果 即时显示到每行的单元格里
      

  7.   

    我没怎么看你的题意,我有个建议你看是否合适
    第一步  DataGridView.DataSource=DataTable第二步
    List<类>a,b,c.....分别对应你的多个线程处理,定时把a,b,c集合里的数据取出来(这里地方最好同步abc而且单线程处理)存入DataTable
    别的细节,或程序你自己写吧,我这样的实现有什么不好的地方,还请看到的高手人多指点一下
      

  8.   

    caller.BeginInvoke(obj, null, null);执行异步时,调用的主线程有可能结束,而回调函数是在主线程回调的,所以有可能找不主线程.
    把回调主线程锁住,直到回调函数执行完毕后再解锁
    查下AutoResetEvent
      

  9.   

     public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            
            private void Form1_Load(object sender, EventArgs e)
            {
                
            }        private void button1_Click(object sender, EventArgs e)
            {            
              for (int i = 0; i < 9; i++)
                {
                    listBox1.Items.Add(0);
                    System.Threading.Thread Add = new System.Threading.Thread(BackThread);
                    Add.Name = i.ToString();
                    Add.IsBackground = true;
                    Add.Start();
                }
                
            }
            private void BackThread()
            {
                int Num = 0;
                for (int i = 0; i < 999; i++)
                {                    Num++;
                        SetDate(Num.ToString(), int.Parse(System.Threading.Thread.CurrentThread.Name));
                        System.Threading.Thread.Sleep(100);            }
            }
            private delegate void Date(string s ,int i);
            private void SetDate(string s ,int i)
            {
                if (listBox1.InvokeRequired)
                {
                   
                    listBox1.Invoke(new Date(SetDate),new object[]{s,i});
                }
                else
                {
                    listBox1.Items[i] = s;
                }
            }        private void button2_Click(object sender, EventArgs e)
            {
                System.Threading.Thread.CurrentThread.Abort();
            }    }楼主要的