C# 自由线程使用

C# 自由线程使用,c#,multithreading,C#,Multithreading,我正在编写一个应用程序,它对我的GUI进行了几次修改,尽管从来不会有两点访问GUI线程的同一部分。应用程序是完全线程安全的,并且很容易理解和理解原因(我有一个修改GUI的调用程序,其余的修改外部类对象,这些对象反过来被GUI控制线程抓取(避免锁定) 我想知道的是,我应该走多远?我的意思是,每次我添加线程都是因为我的GUI变得没有响应,但我是一名软件测试人员,所以这可能与我无法等待半秒钟GUI刷新有关 那么,对于一个小应用程序来说,有多少线程是合理的数量呢?我应该把自己限制在一定的范围内吗?或者我

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

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

那么,对于一个小应用程序来说,有多少线程是合理的数量呢?我应该把自己限制在一定的范围内吗?或者我应该发疯,让我的GUI平滑,就像我喜欢的那样。。。我想这里真正的问题,有答案的问题,是这样的:

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

谢谢

你应该看一下。我知道C#中的windows常用框架并没有很好地实现这一点,但如果您可以将数据与showcase分离,修改它将变得更加容易


同样对于螺纹编号。。。我倾向于尽可能避免他们,但这并不总是可能的。它会导致各种各样的同步问题、竞态条件和死锁,这些都是很难正确理解和调试的。

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

你应该有多少线程?棘手的旋转线程是一个相对昂贵的操作,它也需要相当多的内存,每个线程大约1 Mb来存储线程的堆栈和其他内务处理内容。有一种观点认为,线程数量超过可运行它们的CPU数量是没有意义的,最好的情况是每个CPU核心有一个线程。不仅如此,还会导致不必要的上下文切换和内存使用。很容易找到使用多个线程来占用0%CPU的程序示例-例如,在我的系统上,Windows资源管理器现在使用69个线程来完全不做任何事情。当我只有一个双核CPU时,很难想象为什么Explorer需要69个线程。因为你不知道你的程序在运行时会有多少内核可用,或者系统上的其他程序会做什么,所以你不能真正做出任何假设。答案总是“视情况而定”

NET Framework提供了一种称为线程池的东西,它使您不再担心要创建多少线程,因为线程池会处理所有这些。最好从任务的角度考虑,通过任务队列将任务提交到线程池。线程池从队列中获取任务,并在资源可用时执行这些任务。这样,您就可以维护响应良好的UI,而不必担心线程的管理。理论上。NET将为其运行的系统优化线程池


杰夫·里克特(Jeff Richter)在他的书《通过C#CLR》中提供了一些关于这方面的好信息。这些线程在做什么?我直接说出来,我正在为一个游戏编写一个机器人。机器人需要几个控制元件。它必须能够完全以可见的方式监控游戏(我使用大量的列表视图,以便实时调试),并反过来控制它。我决定使用不同的线程作为“治疗者”工具,在这一点上,我决定我也分开了一些其他。。。他们通常只是从win32调用ReadProcessMemory,以及使用SendMessage和进行计算,以确定下一步要做什么和去哪里…+1作为一个完全有效和合理的问题,我不同意。例如,微软在WinRT上的异步策略(现在找不到这篇文章)是,任何需要10毫秒以上的操作都应该是异步的。嗨@Eric,谢谢你的回复。你觉得MVC模式适用于C#for.NET吗?该语言的大部分代码库似乎鼓励线程使用,因此我首先不担心。我更希望得到确认,以这种方式使用线程比不使用线程更有效率。我的观点与HighCore的观点非常接近——我一直认为规则是25ms。使用线程池生成线程不是一个坏主意。我同意在这种情况下使用MVC。既然OP是一个机器人,那么他应该有一个线程来执行几乎所有的操作。线程不会一直处于活动状态,因此如果他只是发出一个que来生成线程,那么他应该没事。MVC是语言不可知论者。一般来说,您应该尽可能保持组件的独立性。这很有用,因为UI中的线程处理非常复杂,因为您经常需要在UI线程上运行更新,这会导致各种复杂情况。如果您的模型独立于您的UI,您将避免跨线程操作错误。因此,回答HighCore,是的,我同意“长”操作应该是线程化的,这取决于您需要多长时间。但是你不需要很多线程,一个处理消息队列的线程通常足以正确分割UI和模型?我认为答案是有根据的,而且写得相当好。也许只是我内心的一个杰弗里·里克特粉丝在说话。