多线程

时间:2012-10-08 13:21:13

标签: c# winforms multithreading

我正在处理的应用程序执行一些I / O或CPU密集型操作(文件压缩,文件传输,与第三方API通信等),当用户按下“发送”时#39;按钮。

我目前正试图说服我的雇主,我们应该将这些操作推到主应用程序内部的单独线程中(我们需要在任何给定时间最多激活两个工作线程),但是我的同事声称:

  

在低优先级线程上执行的任何额外处理都可能影响GUI的可用性。

我的观点是将I / O或CPU密集型活动推送到工作线程,在进度报告期间使用Invoke调用更新UI,这是处理密集活动的标准做法。

我不对吗?如果是这样,有人可以提供解释吗?

修改

感谢您到目前为止的答案。

我应该澄清一下:同事对非阻塞的解决方案是生成一个包含定时器循环的子进程,该循环扫描文件夹并处理文件压缩/传输活动。 (请注意,这并不包括对第三方API的调用 - 我不知道他的解决方案是什么。

这种方法的主要问题是主要应用程序在任何活动状态下都失去了所有范围。导致恕我直言,进一步复杂化(他的进度报告解决方案是在两个进程中公开Windows消息泵并发送两个进程之间的自定义消息)。

3 个答案:

答案 0 :(得分:4)

你是对的。背景线程是保持UI活动的本质,正如您所描述的那样,通过Invoke操作。将所有内容保存在GUI线程中,最终会堵塞插件并使GUI无响应。

答案 1 :(得分:2)

明确的答案是将其作为概念验证实施,然后对应用进行概要分析,以确定可能存在或不存在哪种潜在性能影响。也许在一个

话虽如此 - 这对我来说听起来像垃圾。事实上,它恰恰相反 - 使用额外的线程通常是保持UI响应的最佳方式。

特别是对于任务并行库这样的东西,基本的多线程并不是很困难。

答案 2 :(得分:1)

是的,你是对的。一般原则是,负责响应用户并保持用户界面最新的线程(通常称为UI线程)不应该用于执行任何冗长的操作。
根据经验,任何可能需要超过30毫秒的事情都是从UI线程中删除的候选者。这有点具有攻击性 - 30ms大约是最短的时间间隔,大多数人会认为它不是瞬间的,而是实际上略小于电影屏幕上显示的连续帧之间的间隔。