假设以下方法被 .net 4 应用程序中的不同线程调用数千次。处理这种情况的最佳方法是什么?了解磁盘是这里的瓶颈,但我希望 WriteFile() 方法能够快速返回。
数据可达几MB。我们是在谈论线程池、TPL 之类的吗?
public void WriteFile(string FileName, MemoryStream Data)
{
try
{
using (FileStream DiskFile = File.OpenWrite(FileName))
{
Data.WriteTo(DiskFile);
DiskFile.Flush();
DiskFile.Close();
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
如果您想快速返回并且并不真正关心操作是同步的,您可以在内存中创建某种类型Queue
您将在其中放置写入请求,当队列未填满时,您可以快速从方法返回。另一个线程将负责调度Queue
和写入文件。如果你的WriteFile
被调用并且队列已满,您将不得不等待,直到可以排队并且执行将再次同步,但是这样您就可以拥有一个大缓冲区,因此如果处理文件写入请求不是线性的,而是更加尖峰(之间有暂停)写入文件调用峰值)此类更改可以视为性能的改进。
UPDATE:给你做了一张小图。请注意,瓶颈始终存在,您所能做的就是使用队列来优化请求。请注意,队列有限制,因此当其填满时,您无法将队列文件插入其中,您必须等待,以便该缓冲区中也有可用空间。但对于图片中显示的情况(3 个存储桶请求),很明显您可以快速将存储桶放入队列并返回,而在第一种情况下,您必须一个一个地执行该操作并阻止执行。
请注意,您永远不需要同时执行许多 IO 线程,因为它们都将使用相同的瓶颈,如果您尝试如此大量并行,您只会浪费内存,我相信 2 - 10 个线程顶部将轻松占用所有可用 IO 带宽,并且也会限制应用程序内存使用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)