C#线程委托问题

C#线程委托问题,c#,datagrid,delegates,multithreading,C#,Datagrid,Delegates,Multithreading,我的处境是,我最终被迫将我的一个程序分割成线程,因为它的速度非常慢 我的情况是我有两个ComponentOne Flexgrid DataGridView组件。。。一个允许直接编辑。我需要第二个网格根据第一个网格更新其内容。 目前我所拥有的是这样的: class MyApp { void GridOne_AfterEdit(object sender, RowColEventArgs e) { UpdateList(); } void Upd

我的处境是,我最终被迫将我的一个程序分割成线程,因为它的速度非常慢

我的情况是我有两个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,但最终只得到了空白的Entry。
另外,我注意到重新启动时出现问题,我想我可以让线程始终侦听或响应布尔值。

不要求某人完成我的代码。简单地问什么是一个有效的选择。谢谢你的提示

foreach (Row r in GridOne.Rows)
不会带来任何乐趣或成功


不会带来任何乐趣或成功。

要获得并行性,最简单的方法是对行集进行分段,例如(此处没有智能感知,请原谅一些小的误用):


我不熟悉这个GridOne控件,也不熟悉我所指的linq扩展是否可用。

要获得并行性,最简单的方法是对行集进行分段,例如(此处没有intellisense,请原谅一些小的误用):



我不熟悉这个GridOne控件,也不熟悉我所指的linq扩展是否可用。

我首先建议您查看内存分析器,看看您的应用程序是否花费了时间,哪些方法花费的时间最多。然后重构,看看是否可以这样加快速度。请添加//每行计算信息的代码并添加到GridTwo,也许我可以看到导致它运行缓慢的原因。是行的枚举速度慢还是计算速度慢?如果是前者,那么这真的很难。如果是晚一点的话,我们可能会帮忙。请记住,从另一个线程中触摸任何UI元素(即使它只是
)都是一个很大的禁忌。计算速度很慢。它是Eve在线工业方面的一个精练计算器。GridOne中的每一行是一个矿石。每一个矿石产生1-4种矿物,这些矿物总计起来,并且弹药是根据设备和技能计算的。因此,这是相当多的计算,如果我能找到如何将整个部分移动到另一个线程,就会加快速度。与直接与组件交互相比,主要使用数据表并编辑/读取数据表中的内容是否更明智?或者我可以设置一种监听器线程,并进行线程循环吗?我首先建议您查看内存分析器,看看您的应用程序是否花费了时间,哪些方法花费的时间最多。然后重构,看看是否可以这样加快速度。请添加//每行计算信息的代码并添加到GridTwo,也许我可以看到导致它运行缓慢的原因。是行的枚举速度慢还是计算速度慢?如果是前者,那么这真的很难。如果是晚一点的话,我们可能会帮忙。请记住,从另一个线程中触摸任何UI元素(即使它只是
)都是一个很大的禁忌。计算速度很慢。它是Eve在线工业方面的一个精练计算器。GridOne中的每一行是一个矿石。每一个矿石产生1-4种矿物,这些矿物总计起来,并且弹药是根据设备和技能计算的。因此,这是相当多的计算,如果我能找到如何将整个部分移动到另一个线程,就会加快速度。与直接与组件交互相比,主要使用数据表并编辑/读取数据表中的内容是否更明智?或者我可以设置一种监听器线程,让线程循环吗?嗯……这取决于你对“乐趣”的定义,不是吗:)嗯……这取决于你对“乐趣”的定义,不是吗:)啊,但是我们怎么知道
实例与大多数其他UI元素及其组成数据结构一样,不受正常线程关联性要求的约束?@Brian one应该始终使用对象文档验证线程安全性,但在示例中,为了构造新行,只能对实时分配的行进行读取。需要通过其他方法锁定所有ui或其他ui,以防止对行执行写操作。是的,我要说的是,大多数ui元素都与ui线程密切相关。所以你不能对他们做任何事情,甚至只是从另一条线读;至少你不该这么做。再多的锁定也解决不了这个问题。那么,像VisualStudio这样的窗体如何使用多个面板和视图。相互交互?以线程安全的方式准备可读的数据可能意味着首先从行中取出数据,或者其他确保线程安全所必需的东西,我只是提出一种并行策略。啊,但是我们怎么知道
实例与大多数其他UI元素及其组成数据结构一样,不受正常线程关联性要求的约束?@Brian one应该始终使用对象文档验证线程安全性,但在示例中,为了构造新行,只能对实时分配的行进行读取。需要通过其他方法锁定所有ui或其他ui,以防止对行执行写操作。是的,我要说的是,大多数ui元素都与ui线程密切相关。所以你不能对他们做任何事情,甚至只是从另一条线读;至少你不该这么做。再多的锁定也解决不了这个问题。那么,像VisualStudio这样的窗体如何使用多个面板和视图。互相交流
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]);