GUI 中的 C# 多线程方法

标签 c# multithreading

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

我有一个 10 列的表。假设我在 ListView 中选择 5 行。 我将 col_1 的所有值放在一个列表中,将其传递给一个方法。

如果所有值都相等,则设置combo_box1 value =“equal”,否则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]

伙计们...需要你们的帮助...任何想法...如何比较图像列表...除上述之外...

谢谢

开发

最佳答案

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

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

worker.RunWorkerAsync();

关于GUI 中的 C# 多线程方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4958940/

相关文章:

c# - 阻止默认发送按钮功能并仅在 Outlook 中执行自定义操作

c# - WPF 单击 ListBoxItem 内的控件不选择 ListBoxItem

c# - 在 Asp.Net MVC 应用程序中启用/创建 SSO(单点登录)

c++ - 队列和线程池之间的交互?

c# - Linq查询OrderBy多个

java - 除非有对 Thread.sleep(...) 的调用,否则简单的 spring 应用程序将终止

Ruby 1.9 线程池

c++ - G++ CAS (__sync_val_compare_and_swap) 问题需要解释

c# - 如何更正错误 "accessed from a thread other than the thread it was created on"?

c# - 嵌套的 Math.Pow(...) 行为怪异