【问题标题】:C# multi-thread approach in GUIGUI中的C#多线程方法
【发布时间】:2011-06-24 22:36:42
【问题描述】:

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

我有一个 10 列的表格。说,我在列表视图中选择 5 行。 我将 col_1 的所有值放在一个列表中,并将其传递给一个方法。

如果所有值都相等,则设置 combo_box1 value = "equal" else value = "not equal"。

目前的方法:

我有 10 个列表(看起来很蹩脚...不是吗?我已经问过一个关于这个的问题...),每个列一个。

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

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

努力投入:

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

[编辑]

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

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

// 创建图像列表 MemoryStream imageStream = new MemoryStream(tempImage.Data.Data); 位图 artCoverImage = new Bitmap(imageStream); // 罪魁祸首? artCoverList.Add(artCoverImage);

// 调用方法 CheckIfEqual(artCoverList) // 罪魁祸首?

// 方法 私人无效 CheckIfEqual(artCoverList) { 位图 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]

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

谢谢,

开发

【问题讨论】:

  • 首先,根据您的操作,将记录增加到 100 应该不会产生太大的影响,尤其是在您只解析列表几次的情况下。其次,我们在这里需要更多信息。你是如何试图操纵你的线程调用的?您希望线程如何工作?
  • 问题是列数可以增加...我想调用,比如说 3 个线程...每个处理 3 个列...像这样..

标签: c# multithreading


【解决方案1】:

我想说的是,不要使用 Invoke,而是查看 BackgroundWorker 。它具有在主线程上自动运行的回调事件,因此它可以让您在完成后更轻松地更新您的 UI,从而避免跨线程 UI 异常。

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

worker.RunWorkerAsync();

【讨论】:

  • 由于您发现它只是导致延迟的单个列,因此多个线程将无济于事-您仍然需要等待耗时的线程最终完成。线程开销将超过其他列的好处。
  • 我在想如果我在主线程中处理 100 列中的 99 列,而这个耗时的列在另一个中...我将能够加快整个进程...
【解决方案2】:

实现线程化设计有其自身的开销并增加了复杂性。如果性能差到足以保证增加的复杂性,您真的只想考虑迁移到线程模型。

如果您有 100 行并且正在检查 10 列的相等性,那么您将进行 1000 次相等性检查。根据实现的不同,这应该是一个微不足道的操作,对性能的影响可以忽略不计。

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

编辑
根据您的发现(图像比较是罪魁祸首),您可能需要考虑对各个图像字节数组使用简单的校验和比较。

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

注意:在这种情况下 MD5 就足够了,应该证明会稍微快一些。

【讨论】:

  • 好吧.. 分析后我发现了导致延迟的虫子...我已经编辑了主要问题...
  • 我听说 MD5 比较比我用过的慢...在采用这种方法之前进行了很多研究...将比较两种方法所花费的时间并查看...我认为从流中生成位图也需要时间……还有其他方法来处理图像吗……?
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2019-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    相关资源
    最近更新 更多