我有一个应用程序,可以使用Flex前端和.NET Web服务将项目及其文件从预览移动到生产。目前,该过程大约需要每个项目5-10分钟。除了延迟问题,它真的不应该花那么长时间。我想知道这是否是一个很好的多线程用例。此外,考虑到用户可能想要一个接一个地推送多个项目,有没有办法排队作业。
非常感谢任何建议和示例。
谢谢!
答案 0 :(得分:4)
执行大量磁盘IO 通常的东西不适合多线程,因为磁盘一次只能做一件事。但是,如果您要推送多台服务器或服务器具有特别好的磁盘子系统,则某些轻型线程可能会有所帮助。
答案 1 :(得分:2)
作为注释 - 无论您是否决定对作业进行排队,都将使用多线程。排队只是处理使用多线程最终解决的问题的一种方法。
是的,我建议您建立一个队列来推出每个项目。
答案 2 :(得分:1)
您应该比较代码的速度与仅在Windows中复制(即资源管理器或命令行)与使用TeraCopy等高级内容进行复制相比较。如果您的代码明显慢于Window,那么请查看代码中的部分以使用分析器进行优化。如果您的代码与Windows一样快但速度比TeraCopy慢,那么多线程可能有所帮助。
当操作I / O绑定时,多线程通常不会有用,但复制文件涉及从磁盘读取和通过网络写入。这是两个I / O操作,因此如果将它们分成不同的线程,则可以提高性能。对于类似这样的事情,你需要一个生产者/消费者设置,你有一个Circular queue,其中一个线程从磁盘读取并写入队列,另一个线程从队列中读取并写入网络。重要的是要记住,两个线程不会以相同的速度运行,因此如果队列已满,请在写入更多数据之前等待,如果它是空的,请在写入之前等待。此外,锁定策略可能会对性能产生很大影响,并且可能导致性能降低到比单线程实现更慢的速度。
答案 3 :(得分:0)
如果您只在两台计算机之间移动,网络将成为瓶颈,因此您可能希望对这些操作进行排队。
同样,在同一台机器上,I / O将成为瓶颈,所以你也想在那里排队。
答案 4 :(得分:0)
您应该尝试使用ThreadPool。
ThreadPool.QueueUserWorkItem(MoveProject, project);
答案 5 :(得分:0)
同意所有人对并行运行任务的有限表现。
如果您可以完全控制部署环境,则可以使用Rhino Queues:
http://ayende.com/Blog/archive/2008/08/01/Rhino-Queues.aspx
这将允许您异步生成作业队列(例如从通过Silverlight / Flex应用程序调用的WCF服务)并同步使用它们。
或者你可以使用WCF和MSMQ,但学习曲线更大。
答案 6 :(得分:0)
使用多个线程处理多个文件时,通常 IS 关注性能。主要原因是现在大多数磁盘都支持native command queuing。
我最近写了一篇关于在ddj.com上读/写带有多个文件的文件的文章。
请参阅http://www.ddj.com/go-parallel/article/showArticle.jhtml?articleID=220300055。
另见相关问题 Will using multiple threads with a RandomAccessFile help performance?
特别是我的经验是,在处理很多文件时, IS 使用多个线程是一个好主意。相反,在许多情况下使用许多线程并不像通常预期的那样减慢应用程序的速度。
话虽如此,我说除了尝试所有可能的不同方法之外别无他法。它取决于很多条件:硬件,操作系统,驱动程序等。
答案 7 :(得分:0)
您应该做的第一件事是为您的软件指出任何类型的分析工具。如果您不能这样做(例如,如果您还没有这样的工具),请插入日志记录代码。
你需要做的第一件事是找出 需要很长时间才能完成,然后为什么需要很长时间才能完成。整个“复制”操作需要很长时间才能完成,这是不够的,你需要找到一个方法或一组方法的原因。
在您这样做之前,您可以对代码执行的所有其他操作可能都是猜测。我的经验告诉我,在性能方面,运行缓慢的10个原因中有9个对编写代码的人感到惊讶。
首先测量,然后改变。
例如,您可能会发现实际上是在报告使用对UI的同步调用将文件以字节为单位复制到GUI的进度,在这种情况下无关紧要实际复制的速度有多快,您仍将受到消息处理速度的限制。
但这只是猜测,直到你知道,所以首先测量,然后改变。