我需要优化 WCF 服务……这是一件相当复杂的事情。这次我的问题与任务有关(Task Parallel Library,.NET 4.0)。发生的情况是,当服务被调用时(使用 Task.Factory.StartNew)我启动了几个任务,然后等待它们完成:
Task.WaitAll(task1, task2, task3, task4, task5, task6);
好吧...我看到但不喜欢的是,在第一次调用时(有时是前 2-3 次调用,如果一个接一个地快速调用),最后的任务比其他任务开始得晚得多(我正在看一个案例,它比其他案例晚 0.5 秒开始)。我试着打电话
ThreadPool.SetMinThreads(12*Environment.ProcessorCount, 20);
在我的服务开始时,但它似乎没有帮助。
任务都是与数据库相关的:我正在从多个数据库中读取数据,并且它必须花费尽可能少的时间。
知道为什么最后一个任务花了这么长时间吗?有什么我可以做的吗?
或者,我应该直接使用线程池吗?碰巧的是,在我正在查看的一种情况下,一个任务在最后一个任务开始之前就已经结束了——如果我重用那个线程而不是等待创建一个新线程,我会节省 0.2 秒。但是,我不能确定那个任务总是会这么快结束,所以我不能将两个请求放在同一个任务中。
[编辑] 操作系统是Windows Server 2003,所以应该没有连接限制。此外,它托管在 IIS 中 - 我不知道我应该创建常规线程还是使用线程池 - 哪个是首选版本?
[编辑] 我也尝试过使用 Task.Factory.StartNew(action, TaskCreationOptions.LongRunning); - 它没有帮助,最后一个任务仍然很晚才开始(大约半个一秒后)比其余的。
[编辑] MSDN 1说:
The thread pool has a built-in delay (half a second in the .NET Framework version 2.0) before starting new idle threads. If your application periodically starts many tasks in a short time, a small increase in the number of idle threads can produce a significant increase in throughput. Setting the number of idle threads too high consumes system resources needlessly.
但是,正如我所说,我已经在调用 SetMinThreads,但它没有帮助。
最佳答案
在使用 (.Net 4.0) 任务对象时,我自己遇到了线程启动延迟的问题。因此,对于时间紧迫的事情,我现在使用专用线程(...再一次,因为那是我在 .Net 4.0 之前所做的。)
线程池的目的是避免启动和停止线程的操作系统成本。线程只是被重用。这是在例如 Internet 服务器中发现的常见模型。优点是他们可以更快地响应。
我编写了许多应用程序,在这些应用程序中,我通过让专用线程从任务队列中挑选任务来实现我自己的线程池。但是请注意,这通常需要锁定,这可能会导致延迟/瓶颈。这取决于您的设计;如果任务很小,那么就会有很多锁定,用一些 CPU 换取更少的锁定可能会更快:http://www.boyet.com/Articles/LockfreeStack.html
SmartThreadPool 是 .Net 线程池的替代/扩展。正如您在此链接中看到的那样,它有一个很好的 GUI 来进行一些测试:http://www.codeproject.com/KB/threads/smartthreadpool.aspx
最后这取决于你需要什么,但为了高性能我建议实现你自己的线程池。如果您遇到大量线程空闲,那么增加线程数(超过推荐的 cpucount*2)可能会有所帮助。这实际上是 HyperThreading 在 CPU 内部的工作方式 - 在执行操作时使用“空闲”时间来执行其他操作。
请注意,.Net 具有每个进程 25 个线程的内置限制(即对于您同时接收的所有 WCF 调用)。此限制是独立的并会覆盖 ThreadPool 设置。它可以增加,但需要一些魔法:http://www.csharpfriends.com/Articles/getArticle.aspx?articleID=201
关于c# - 从 WCF 服务启动多个任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4718617/
我试图在一个项目中使用rake,如果我把所有东西都放到Rakefile中,它会很大并且很难读取/找到东西,所以我试着将每个命名空间放在lib/rake中它自己的文件中,我添加了这个到我的rake文件的顶部:Dir['#{File.dirname(__FILE__)}/lib/rake/*.rake'].map{|f|requiref}它加载文件没问题,但没有任务。我现在只有一个.rake文件作为测试,名为“servers.rake”,它看起来像这样:namespace:serverdotask:testdoputs"test"endend所以当我运行rakeserver:testid时
我正在尝试使用ruby和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这