如何简化和优化此C#代码
我有这样一种方法:如何简化和优化此C#代码,c#,performance,optimization,foreach,C#,Performance,Optimization,Foreach,我有这样一种方法: public ConcurrentBag<FileModel> GetExceptionFiles(List<string> foldersPath, List<string> someList) { for (var i = 0; i < foldersPath.Count; i++) { var index = i; new Thread(delegate() {
public ConcurrentBag<FileModel> GetExceptionFiles(List<string> foldersPath, List<string> someList)
{
for (var i = 0; i < foldersPath.Count; i++)
{
var index = i;
new Thread(delegate()
{
foreach (var file in BrowseFiles(foldersPath[index]))
{
if (file.Name.Contains(someList[0]) || file.Name.Contains(someList[1]))
{
using (var fileStream = File.Open(file.Path, FileMode.Open))
using (var bufferedStream = new BufferedStream(fileStream))
using (var streamReader = new StreamReader(bufferedStream))
...
我现在要做的是将这一行替换为检查列表中所有元素的内容someList
我该怎么做
编辑
现在我用if(someList.Any(item=>file.Name.Contains(item))if替换了这一行。
下一个问题是,知道
foldersPath
中的每个项目在我的网络中都是一个单独的硬盘驱动器(通常不超过5个硬盘驱动器)。您可以使用类似if(someList.Any(item=>file.Name.Contains(item))
这将迭代
someList
中的每个项,并检查文件名中是否包含任何项,返回一个布尔值以指示是否找到任何匹配项您可以使用类似if(someList.any(item=>file.name.Contains(item))
这将迭代someList
中的每个项目,并检查文件名中是否包含任何项目,首先返回一个布尔值以指示是否找到任何匹配项
有一句老话是计算机科学,“CS中有两个难题,命名、缓存失效和逐个错误。”
不要对循环使用,除非您必须这样做,否则您获得的微小性能增益不值得调试时间(假设此版本的.net中存在任何性能增益)
其次
新线程
。不要那样做。线程的创建速度非常慢,并且会占用大量资源,特别是对于这样一个生命周期很短的进程。除此之外,在线程之间传递数据还存在开销。如果必须执行短期线程,请使用ThreadPool.QueueUserWorkItem(WaitCallback)
然而,正如我先前提到的那样。线程是CPU资源的抽象。我真的怀疑你是CPU的束缚。穿线的成本比你想象的要高。坚持单线程。但是,您受到I/O的限制,因此要充分利用异步I/O
public async Task<IEnumerable<FileModel>> GetExceptionFiles(List<string> foldersPath, List<string> someList)
{
foreach (var folderPath in foldersPath)
foreach (var file in BrowseFiles(folderPath))
{
if (false == someList.Any(x => file.Name.Contains(x, StringComparer.InvariantCultureCaseIgnore)))
continue;
using (var fileStream = await File.OpenTaskAsync(file.Path, FileMode.Open))
using (var bufferedStream = new BufferedStream(fileStream))
using (var streamReader = new StreamReader(bufferedStream))
...
yield return new FileModel();
public异步任务GetExceptionFiles(List foldersPath,List someList)
{
foreach(foldersPath中的var folderPath)
foreach(BrowseFiles(folderPath)中的var文件)
{
if(false==someList.Any(x=>file.Name.Contains(x,StringComparer.InvariantCultureCaseIgnore)))
继续;
使用(var fileStream=await File.opentaskanc(File.Path,FileMode.Open))
使用(var bufferedStream=new bufferedStream(fileStream))
使用(var streamReader=newstreamreader(bufferedStream))
...
返回新的FileModel();
轻浮
有一句老话是计算机科学,“CS中有两个难题,命名、缓存失效和逐个错误。”
不要对
循环使用,除非您必须这样做,否则您获得的微小性能增益不值得调试时间(假设此版本的.net中存在任何性能增益)
其次
新建线程
。不要这样做。线程的创建速度非常慢,并且会占用大量资源,特别是对于这样的短期进程。此外,在线程之间传递数据会有开销。如果必须执行短期线程,请改为使用ThreadPool.QueueUserWorkItem(WaitCallback)
然而,正如我之前提到的。线程是CPU资源的抽象。我真的怀疑您是否受CPU限制。线程的成本将比您想象的要高。坚持使用单线程。无论您受I/O限制,因此充分利用异步I/O
public async Task<IEnumerable<FileModel>> GetExceptionFiles(List<string> foldersPath, List<string> someList)
{
foreach (var folderPath in foldersPath)
foreach (var file in BrowseFiles(folderPath))
{
if (false == someList.Any(x => file.Name.Contains(x, StringComparer.InvariantCultureCaseIgnore)))
continue;
using (var fileStream = await File.OpenTaskAsync(file.Path, FileMode.Open))
using (var bufferedStream = new BufferedStream(fileStream))
using (var streamReader = new StreamReader(bufferedStream))
...
yield return new FileModel();
public异步任务GetExceptionFiles(List foldersPath,List someList)
{
foreach(foldersPath中的var folderPath)
foreach(BrowseFiles(folderPath)中的var文件)
{
if(false==someList.Any(x=>file.Name.Contains(x,StringComparer.InvariantCultureCaseIgnore)))
继续;
使用(var fileStream=await File.opentaskanc(File.Path,FileMode.Open))
使用(var bufferedStream=new bufferedStream(fileStream))
使用(var streamReader=newstreamreader(bufferedStream))
...
返回新的FileModel();
你确定这些线程确实加速了整个过程吗?无论如何,你都应该受到I/O的限制。HOLY$%&你正在创建大量线程,甚至没有使用线程池。首先,你不应该使用像C这样的现代计算机编程语言来处理这样的事情(Java,胡说八道)。使用async await。在问题文本中,您要求简化代码,而在标记中,您列出优化和性能。这些目标可能相互矛盾。@Lucastzesniewski,我想(是的),因为foldersPath
中的每个文件夹实际上都是一个单独的硬盘驱动器,不应该这样问吗?你确定这些线程实际上加速了整个过程吗?无论如何,你应该是I/O绑定的。HOLY.%&你正在创建大量线程,甚至没有使用线程池。首先,你不应该使用现代线程像C#这样的计算机编程语言(Java,快去吧)。使用async Wait。在你的问题文本中,你要求简化代码,而在你的标记中,你列出优化和性能。这些可能是相互矛盾的目标。@Lucastzesniewski,我想(是的),因为foldersPath
中的每个文件夹实际上都是一个单独的硬盘驱动器。这不应该被问到吗?它应该是Any
而不是All
。当我编辑它时发现了这一点以添加更多的解释。谢谢@DirkIt应该是Any
而不是All
。在我被编辑时发现了我想多加一点解释。谢谢@Dirk