Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#-改进多线程应用程序设计 规范 C#分布式应用程序 客户机/服务器设计 客户端(Winforms)、服务器(Windows服务)、通过.Net远程处理进行通信 下面的问题与应用程序的服务器端有关 (编辑)应用程序的服务器端运行在具有8个内核和12Gb Ram的服务器上 (编辑)由于在同一台服务器上运行大量其他服务,此服务器的CPU的使用率始终在80%左右 脚本 我继承了一个大型遗留应用程序 它执行一系列任务,其中一些是独立完成的,而另一些则不是 此应用程序的当前设计涉及创建14个线程,每个线程运行1个任务或多个任务 问题是我觉得这个设计元素对性能有影响 代码示例-如何设计和运行每个类/线程 思想 我想做的是保留现有代码,但修改它的运行方式 我曾经考虑过使用线程池来解决这个问题,但是考虑到当前的体系结构,我不确定如何去做 问题 当前的设计是否会显著影响性能 我是否有可能在不改变底层功能的情况下提高这个应用程序的性能,但稍微改变一下设计 有人能给我推荐/建议如何改进这一点吗_C#_Design Patterns_Architecture_Multithreading - Fatal编程技术网

C#-改进多线程应用程序设计 规范 C#分布式应用程序 客户机/服务器设计 客户端(Winforms)、服务器(Windows服务)、通过.Net远程处理进行通信 下面的问题与应用程序的服务器端有关 (编辑)应用程序的服务器端运行在具有8个内核和12Gb Ram的服务器上 (编辑)由于在同一台服务器上运行大量其他服务,此服务器的CPU的使用率始终在80%左右 脚本 我继承了一个大型遗留应用程序 它执行一系列任务,其中一些是独立完成的,而另一些则不是 此应用程序的当前设计涉及创建14个线程,每个线程运行1个任务或多个任务 问题是我觉得这个设计元素对性能有影响 代码示例-如何设计和运行每个类/线程 思想 我想做的是保留现有代码,但修改它的运行方式 我曾经考虑过使用线程池来解决这个问题,但是考虑到当前的体系结构,我不确定如何去做 问题 当前的设计是否会显著影响性能 我是否有可能在不改变底层功能的情况下提高这个应用程序的性能,但稍微改变一下设计 有人能给我推荐/建议如何改进这一点吗

C#-改进多线程应用程序设计 规范 C#分布式应用程序 客户机/服务器设计 客户端(Winforms)、服务器(Windows服务)、通过.Net远程处理进行通信 下面的问题与应用程序的服务器端有关 (编辑)应用程序的服务器端运行在具有8个内核和12Gb Ram的服务器上 (编辑)由于在同一台服务器上运行大量其他服务,此服务器的CPU的使用率始终在80%左右 脚本 我继承了一个大型遗留应用程序 它执行一系列任务,其中一些是独立完成的,而另一些则不是 此应用程序的当前设计涉及创建14个线程,每个线程运行1个任务或多个任务 问题是我觉得这个设计元素对性能有影响 代码示例-如何设计和运行每个类/线程 思想 我想做的是保留现有代码,但修改它的运行方式 我曾经考虑过使用线程池来解决这个问题,但是考虑到当前的体系结构,我不确定如何去做 问题 当前的设计是否会显著影响性能 我是否有可能在不改变底层功能的情况下提高这个应用程序的性能,但稍微改变一下设计 有人能给我推荐/建议如何改进这一点吗,c#,design-patterns,architecture,multithreading,C#,Design Patterns,Architecture,Multithreading,非常感谢你的帮助 “我感觉这个设计元素对性能有影响。” 不要猜测,拿出一个轮廓仪来测量发生了什么。收集一些关于在应用程序中花费的时间的经验统计数据,然后您就可以了解关键点在哪里 如果花在创建线程上的时间是你最头疼的事情,那么转移到线程池可能是正确的答案,但是如果没有一些法医学分析,你就不会知道 从您发布的小片段来看,这14个线程的寿命相当长,在它们的生命周期中做了许多事情,所以我怀疑这实际上不是问题所在,但您的帖子中没有足够的信息对此做出明确的说明 “我感觉这个设计元素对性能有影响。” 不要猜测

非常感谢你的帮助

“我感觉这个设计元素对性能有影响。”

不要猜测,拿出一个轮廓仪来测量发生了什么。收集一些关于在应用程序中花费的时间的经验统计数据,然后您就可以了解关键点在哪里

如果花在创建线程上的时间是你最头疼的事情,那么转移到线程池可能是正确的答案,但是如果没有一些法医学分析,你就不会知道

从您发布的小片段来看,这14个线程的寿命相当长,在它们的生命周期中做了许多事情,所以我怀疑这实际上不是问题所在,但您的帖子中没有足够的信息对此做出明确的说明

“我感觉这个设计元素对性能有影响。”

不要猜测,拿出一个轮廓仪来测量发生了什么。收集一些关于在应用程序中花费的时间的经验统计数据,然后您就可以了解关键点在哪里

如果花在创建线程上的时间是你最头疼的事情,那么转移到线程池可能是正确的答案,但是如果没有一些法医学分析,你就不会知道


从您发布的小片段来看,这14个线程的寿命相当长,在它们的生命周期中做了很多事情,所以我怀疑这实际上不是问题所在,但是您的帖子中没有足够的信息来对此做出明确的判断。

如果您的线程都在工作,并且您的活动线程比处理器多,那么您将花费时间切换上下文

如果您有一个双核处理器,不要期望在超过4个活动工作线程的情况下获得很好的性能

因此,启动14个线程,这些线程都在工作,这是一个坏主意,除非你有一个处理器可以管理它。物理处理器体系结构和功能集在这方面有很大影响。我的观点是线程池将有助于管理上下文切换,但同时启动14个繁忙线程总是会降低性能。。。只需按顺序执行线程,您可能会获得更快的性能。很明显,这是一个很大的声明,所以可能不是trus,但你明白了要点

因此,使用线程池和探查器来计算线程池可用的最佳线程数

在大多数情况下,当人们使用一个线程池时,很多线程在大部分时间里什么也不做,或者一个线程正在休眠/阻塞,而一些缓慢的操作或外部依赖性正在等待响应

考虑使用异步模式,这样您就可以获得有关线程进度的信息


在双核处理器上,如果3个以上的线程都在100%的时间内工作,我会犹豫是否使用它们。如果你的线程都在工作,并且你的活动线程比处理器多,那么你就要花时间切换上下文

如果您有一个双核处理器,不要期望在超过4个活动工作线程的情况下获得很好的性能

因此,启动14个线程,这些线程都在工作,这是一个坏主意,除非你有一个处理器可以管理它。物理处理器体系结构和功能集在这方面有很大影响。我的观点是线程池将有助于管理上下文切换,但同时启动14个繁忙线程总是会降低性能。。。只需按顺序执行线程,您可能会获得更快的性能。很明显,这是一个很大的声明,所以可能不是trus,但你明白了要点

因此,使用线程池和探查器来计算线程池可用的最佳线程数

在大多数情况下,当人们使用一个线程池时,很多线程在大部分时间里什么也不做,或者一个线程正在休眠/阻塞,而一些缓慢的操作或外部依赖性正在等待响应

考虑使用异步模式,这样您就可以获得有关线程进度的信息

在双核处理器上,如果3个以上的线程都能100%工作,我会犹豫是否使用它们
public class ManageThreads
{
    private Thread doStuffThread = null;

    //Inside the constructor EVERY thread is instantiated and run.
    //(I am aware that this example only shows the use of 1 thread).
    public ManageThreads()
    {
       doStuffThread = new Thread(new ThreadStart(DoSomeStuff.Instance.Start));
       doStuffThread.Start();

       //Instantiate and run another thread.....
       //Instantiate and run another thread.....
       //Instantiate and run another thread.....etc.
    }

}

public class DoSomeStuff
{
    void Start()
    { 
        while(true)
        {
          //Repeatedly do some tasks.....

          Thread.Sleep(5000);
        }
     }   
 }