【发布时间】:2015-02-22 22:18:19
【问题描述】:
有谁知道为什么这段代码会拖慢 UI:
Thread trdGenerateTrajectory = new Thread(() => HeavyMethod());
trdGenerateTrajectory.Start();
trdGenerateTrajectory.Join();
这应该在与主线程不同的线程中,对吗?如果是这样,为什么运行它会减慢/冻结 UL?
编辑:感谢您的 cmets。我删除了 Join(),但它仍然冻结了 UI。有什么想法吗?
更新:HeavyMethod() 方法正在调用我创建的 Matlab dll 中的方法。 dll中的方法为机器人生成操纵轨迹。我的项目是一个重型机器人项目,它与许多硬件/设备进行通信。该项目有 12 个后台工作人员和一个计时器。计时器负责更新 UI 及其上的所有文本/颜色/图像/...。到目前为止,我对后台工作程序和计时器没有任何问题,无论他们运行的任务有多么繁重,我从未看到计时器和 UI 更新有任何延迟或停止。但是,当我在 Matlab dll 中调用此特定方法时,我看到 UI 完全停止更新,直到该方法完成。这是我的经历:
- 我使用线程(上面的代码)没有运气。
- 然后我将方法和运行方法后的进程移到另一个后台工作程序中,但还是没有运气。
然后我意识到我的表单上只有一些文本框遇到了这个问题。它们是从同一个 Matlab dll 的另一种方法中获取值的那些。那个时候我才意识到这个问题与线程/后台工作者无关,与 Matlab 运行方法的方式有关。也许它是单线程的!?无论如何,如果我为这个生成轨迹的特定方法制作单独的 dll 可能会有所帮助,所以我创建了另一个 dll,但我遇到了完全相同的问题。似乎 Matlab dll 一次只能运行一种方法,无论您是从不同的线程还是从单独的 dll 调用它们。我相信我应该在单独的 SO 问题中提出这个问题,我会的,但是与此同时,您对此有何评论? (更新:我没有收到任何回复,所以我发布了一个新问题:Calling two functions from a single Matlab dll at the same time)
【问题讨论】:
-
你在使用 cpusets - 并且代码是在多核系统上吗?
-
异步与同步、调度程序线程等可以帮助您。您创建了一个线程,如何以及何时运行它。 UI 线程在运行时会发生什么?有进度条在运行吗?
-
这是什么程序? Windows 窗体?
-
是的,它在 8 核系统上。我有一个更新texboxes的计时器。当我运行上面的代码时,文本框中的文本会停止更新,直到这个线程完成。我的程序是 Winform。
-
如果您的 UI 在移除 Join() 后仍处于阻塞状态,则 HeavyMethod() 中的代码未正确使用主 UI 线程。也许你在那里有一个 Invoke() 调用?...
标签: c# multithreading user-interface freeze