C#线程代表问题

时间:2011-07-27 20:36:19

标签: c# datagrid delegates multithreading

我处于这样的位置,我最终被迫将我的程序分成线程,因为它非常缓慢。

我的情况是我有两个ComponentOne Flexgrid DataGridView组件......一个允许直接编辑。我需要第二个网格根据第一个网格更新其内容
目前我所拥有的是这样的:

class MyApp
{
    void GridOne_AfterEdit(object sender, RowColEventArgs e)
    {
        UpdateList();
    }

    void UpdateList()
    {
        foreach (Row r in GridOne.Rows)
        {
            //calculate information per row and add to GridTwo
        }
    }
}



这是无法忍受的慢......根据我对代表的理解,我需要为我需要访问/引用的每个组件设一个代表?

我已经尝试过将GridTwo分配给DataTable并从线程中修改DataTable的事情,但最后只有空白的委托。 此外,我注意到我重新启动它有问题,我想我可以让线程始终监听或响应布尔值。

不要求别人完成我的代码。简单地问一个有效的选择是什么。感谢您的任何提示!

2 个答案:

答案 0 :(得分:1)

foreach (Row r in GridOne.Rows)

不会有任何乐趣或成功。

答案 1 :(得分:0)

你可能做的最简单的事情就是划分你的行集,比如(这里没有intellisense所以请原谅轻微的误用):

var gridOneFirstHalf = new Row[][] { GridOne.Rows.Take(GridOne.Rows.Count / 2), new Row[GridOne.Rows.Count / 2] };
var gridOneSecondHalf = new Row[][] { GridOne.Rows.Skip(GridOne.Rows.Count / 2).ToArray(), new Row[GridOne.Rows.Count / 2] };

ParameterizedThreadStart halfThreadStarter = new ParameterizedThreadState((state) => ProcessIntoResultsMember(state));

Thread processFirstHalf = new Thread(halfThreadStarter, gridOneFirstHalf);
Thread processSecondHalf = new Thread(halfThreadStarter, gridOneSecondHalf);

processFirstHalf.Start();
processSecondHalf.Start();

processFirstHalf.Join();
processSecondHalf.Join();

GridTwo.Rows = gridOneFirstHalf[1].Concat(gridOneSecondHalf[1]);

我不熟悉这个GridOne控件或者我所指的linq扩展是否可用..