GUI中的C#多线程方法

时间:2011-02-10 15:21:58

标签: c# multithreading

我正在开发一款小应用。需要你的帮助。

我有一个10列的表。比如说,我在列表视图中选择了5行。 我在列表中获取col_1的所有值,将其传递给方法。

如果所有值都相等,请设置combo_box1 value =“equal”else value =“not equal”。

当前方法:

我有10个清单(看起来很蹩脚......不是吗?我问过这个问题......),每个清单一个。

10次调用检查值相等的方法,每次调用一个列表。随后,设置组合框的(10个组合框)值。

如果我说100条记录,我想所花费的时间会增加。所以,我想实现线程。

努力投放:

我已经尝试使用this.Invoke(new Delegate ...)方法来尝试访问主线程的控件。它工作正常。我试图根据我的需要操纵它。不能这样做。请帮帮我们。

[编辑]

主要罪魁祸首是图像比较...它花了很长时间才完成......下面是代码...... 我在列表中存储了10行的所有图像(比如第3列)...

// other stuffs [DllImport("msvcrt.dll", CallingConvention=CallingConvention.Cdecl)] private static extern int memcmp(IntPtr b1, IntPtr b2, long count);

// create a list of images MemoryStream imageStream = new MemoryStream(tempImage.Data.Data); Bitmap artCoverImage = new Bitmap(imageStream); // culprit ? artCoverList.Add(artCoverImage);

// call the method CheckIfEqual(artCoverList) // culprit ?

// THE method private void CheckIfEqual(artCoverList) { Bitmap tempBitMap = artCoverList[0];

foreach (Bitmap bmp in artCoverList) { if (bmp == null) return false; if (bmp.Size != tempBitMap.Size) return false; var bd1 = tempBitMap.LockBits(new Rectangle(new Point(0, 0), tempBitMap.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); IntPtr bd1scan0 = bd1.Scan0; int stride = bd1.Stride; long len = stride * tempBitMap.Height; var bd2 = bmp.LockBits(new Rectangle(new Point(0, 0), bmp.Size), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb); IntPtr bd2scan0 = bd2.Scan0; returnValue = memcmp(bd1scan0, bd2scan0, len) == 0; bmp.UnlockBits(bd2); tempBitMap.UnlockBits(bd1); } }

我花了一整天的时间来完成这部分图像比较......我认为将mem流转换为bmp的部分是罪魁祸首......

[编辑2]

伙计......需要你的帮助......任何想法...如何比较图像列表......除了上面......

谢谢,

开发

3 个答案:

答案 0 :(得分:2)

实现线程设计有其自身的开销并增加了复杂性。如果性能足够差以至于需要增加复杂性,那么你真的只想考虑转向线程模型。

如果你有100行而你正在检查10列的相等性,那么你正在进行1000次相等检查。根据实施情况,这应该是一项微不足道的操作,其性能影响可以忽略不计。

考虑分析您的应用程序以查看是否存在性能问题。

修改
根据您的发现(图像比较是罪魁祸首),您可能需要考虑对相应的图像字节数组进行简单的校验和比较。

以下是如何执行此操作的示例: http://www.dreamincode.net/code/snippet2859.htm

注意:在这种情况下,MD5就足够了,应该证明速度稍快。

答案 1 :(得分:2)

我想说的是,不要使用Invoke,请查看BackgroundWorker。它具有自动在主线程上运行的回调事件,因此当您更容易完成时,它会更新您的UI,以避免跨线程UI异常。

BackgroundWorker worker = new BackgroundWorker();
worker.RunWorkerCompleted += (s, e) => updateUI();
worker.DoWork += (s, e) => longProcess();

worker.RunWorkerAsync();

答案 2 :(得分:0)

检查列表中所有元素是否相同的一种方法是将它们填入HashSet然后检查HashSet中的项目数量:如果您只有一个项目,那么他们都是平等的......