自由主义线程用法

时间:2013-06-07 22:18:10

标签: c# multithreading

我正在编写一个应用程序,它对我的​​GUI进行了一些修改,尽管从来没有两个点可以访问GUI线程的相同部分。该应用程序完全是线程安全的,它很容易理解并看到原因(我有一个修改GUI的调用者,其余的修改外部类对象,这些对象反过来被抓取 - 避免锁定 - 由GUI控制线程。 )

我想知道的是,我应该走多远?我的意思是,每次我添加一个线程都是因为我的GUI变得没有响应,但我是一个软件测试人员,所以这可能与我无法等待半秒钟以便刷新GUI有关。 / p>

那么,对于小型应用程序,有多少线程是合理的?我应该限制自己到一定数量吗?或者我应该生气,让我的GUI流畅,我喜欢......我想这里真正的问题,那个有答案的问题,就像这样:

在任何可能的情况下使用多个线程是否有效,或者使用太多线程是否有害,或者是否应该仔细平衡以生成高效但有效的应用程序?

由于

2 个答案:

答案 0 :(得分:1)

清楚地理解异步编程和线程之间的区别非常重要。 Windows窗体应用程序在单线程单元中运行,但它们仍然可以通过在Windows消息队列上分派任务来执行异步操作。因此,可以异步执行操作,而不需要线程。线程并不总是(可能不经常)处理异步性的最佳方式。

你应该有多少线程?棘手。旋转线程是一个相对昂贵的操作,它也需要相当多的内存,每个线程大约1 Mb来存储线程的堆栈和其他内务处理的东西。有一个论点说,拥有更多的线程比运行它们的CPU数量没有意义,最好的情况是每个CPU核心一个线程。不仅如此,还会导致不必要的上下文切换和内存使用。很容易找到使用许多线程占用CPU的0%的程序示例 - 例如在我的系统上,Windows资源管理器使用69个线程完全没有做任何事情。我很难想象当我只有一个双核CPU时,Explorer需要69个线程。由于您不知道程序运行时可用的内核数量,或系统上其他程序将执行的内容,因此您无法做出任何假设。答案总是“取决于”。

.NET Framework提供了一个称为线程池的东西,这使您无需担心要创建多少线程,因为线程池会处理所有这些问题。最好根据通过任务队列提交给线程池的任务进行思考。线程池从队列中获取任务,并在资源可用时执行它们。这使您可以维护响应式UI,而无需担心管理线程。理论上。 .NET将优化运行它的系统的线程池。

Jeff Richter在他的书 CLR通过C# 中提供了一些很好的信息。

答案 1 :(得分:0)

您应该查看MVC model。我知道C#中常用的Windows框架并没有强制执行,但是如果你可以将数据与展示区分开,那么修改它将变得更加容易。

同样对于线程编号......我倾向于尽可能地避免它们,但并不总是可行的。它会导致各种同步问题,竞争条件和死锁,这些都很难找到并正确调试。