Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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#_Apache Flex_Multithreading_Queue - Fatal编程技术网

C#-将文件移动到队列或多线程

C#-将文件移动到队列或多线程,c#,apache-flex,multithreading,queue,C#,Apache Flex,Multithreading,Queue,我有一个应用程序,它使用Flex前端和.NET web服务将项目及其文件从预览移动到生产。目前,每个项目大约需要5-10分钟。除了延迟问题,它真的不应该花那么长时间。我想知道这是否是多线程的一个好用例。此外,考虑到用户可能希望推送多个项目或一个接一个项目,是否有一种方法可以将作业排队 任何建议和例子都将不胜感激 谢谢 由于磁盘一次只能做一件事,因此执行大量磁盘IO的操作通常不是多线程的好选择。但是,如果您要使用多台服务器,或者服务器具有特别好的磁盘子系统,那么一些简单的线程处理可能是有益的。如果

我有一个应用程序,它使用Flex前端和.NET web服务将项目及其文件从预览移动到生产。目前,每个项目大约需要5-10分钟。除了延迟问题,它真的不应该花那么长时间。我想知道这是否是多线程的一个好用例。此外,考虑到用户可能希望推送多个项目或一个接一个项目,是否有一种方法可以将作业排队

任何建议和例子都将不胜感激


谢谢

由于磁盘一次只能做一件事,因此执行大量磁盘IO的操作通常不是多线程的好选择。但是,如果您要使用多台服务器,或者服务器具有特别好的磁盘子系统,那么一些简单的线程处理可能是有益的。

如果您只在两台计算机之间移动东西,网络将成为瓶颈,因此您可能希望对这些操作进行排队


同样,在同一台机器上,I/O将成为瓶颈,因此您也希望在那里排队。

请注意,无论您是否决定将作业排队,都将使用多线程。排队只是处理最终使用多线程解决的问题的一种方法


是的,我建议您构建一个队列来推出每个项目。

您应该尝试使用线程池

ThreadPool.QueueUserWorkItem(MoveProject, project);

您应该将代码的速度与仅在Windows(即资源管理器或命令行)中复制与使用高级工具(如)复制进行比较。若您的代码明显比Window慢,那个么请查看代码中的部分以使用探查器进行优化。如果您的代码与Windows一样快,但比TeraCopy慢,那么多线程可能会有所帮助


当操作I/O绑定时,多线程通常没有帮助,但复制文件涉及从磁盘读取和通过网络写入。这是两个I/O操作,因此如果将它们分离到不同的线程上,可以提高性能。对于这种情况,您需要一个生产者/消费者设置,其中一个线程从磁盘读取并写入队列,另一个线程从队列读取并写入网络。请记住,这两个线程不会以相同的速度运行,因此,如果队列已满,请在写入更多数据之前等待,如果队列为空,请在写入之前等待。此外,锁定策略可能会对性能产生很大影响,并可能导致性能降低到比单线程实现更慢。

大家都同意并行运行任务的性能有限

如果您完全控制部署环境,则可以使用Rhino队列:

这将允许您异步生成作业队列(例如从Silverlight/Flex应用程序调用的WCF服务),并同步使用它们


或者,您可以使用WCF和MSMQ,但学习曲线更大。

在使用多线程处理多个文件时,从性能角度考虑,通常是一个好主意。主要原因是现在大多数磁盘都支持

我最近写了一篇关于在ddj.com上读写多个文件的文章

另见相关问题

特别是我的经验是,在处理很多文件时,最好使用多个线程。相反,在许多情况下使用多线程并不会像通常预期的那样降低应用程序的速度


话虽如此,我想说,除了尝试所有可能的不同方法之外,没有其他方法可以找到答案。这取决于很多条件:硬件、操作系统、驱动程序等。

您应该做的第一件事是将任何类型的分析工具指向您的软件。如果您不能这样做(比如,如果您没有这样的工具),请插入日志代码

你需要做的第一件事就是弄清楚什么需要很长时间才能完成,然后弄清楚为什么需要很长时间才能完成。您的“复制”操作作为一个整体需要很长时间才能完成,这还不够好,您需要将原因归结为一个方法或一组方法

在您这样做之前,您可以对代码执行的所有其他操作都可能是猜测。我的经验告诉我,当谈到性能时,10个运行缓慢的原因中有9个对编写代码的人来说是令人惊讶的

所以先测量,然后改变

例如,您可能会发现,事实上,您正在使用对UI的同步调用,以字节为单位向GUI报告文件复制的进度,在这种情况下,不管实际复制的运行速度有多快,您仍然会受到消息处理速度的限制


但这只是猜测,直到你知道,所以先测量,然后改变。

你分析过这一点,以确定为什么它需要比预期更长的时间吗?roygbiv是正确的-如果你正在最大限度地利用磁盘或网络带宽,就没有点多线程,这就是为什么它需要如此长的时间。找出它为何如此缓慢,而不是采取随机的纠正措施。正如罗伊格比夫和迈克尔指出的那样,你需要做一些分析,以免你最终优化了错误的东西。5-10分钟中有多少是处理器、磁盘i/o和网络流量。压缩有帮助吗?是否有可以并行完成的任务?你的应用程序主要是在等待web服务吗?即使是一些相当简单的跟踪语句也应该产生一些有用的观察结果。如果磁盘速度慢怎么办?如果他一次复制1个字节,并使用跨线程边界的同步调用向GUI报告进度,或者使用相当于“Application.DoEvents”的方法来确保GUI更新以反映他的新进度,该怎么办?我同意这样的原则,即在最佳解决方案中,网络将成为瓶颈,但是