限制进程的CPU使用率

jb.*_*jb. 11 c# optimization performance background

我有一个服务运行,它定期检查文件夹中的文件,然后处理它.(读取它,提取数据,将其存储在sql中)

所以我在测试盒上运行它,预计需要更长的时间.该文件有160万行,它在6小时后仍在运行(然后我回家了).

问题是它运行的盒子现在已经完全瘫痪了 - 远程桌面超时了所以我甚至无法停止它来停止这个过程,或者附加一个调试器来看看有多远等等.它坚固地使用90%+ CPU,以及所有其他正在运行的服务或应用程序

代码是(从内存中,可能无法编译):

List<ItemDTO> items = new List<ItemDTO>();
using (StreamReader sr = fileInfo.OpenText())
{
    while (!sr.EndOfFile)
    {
        string line = sr.ReadLine()
        try {
           string s = line.Substring(0,8);
           double y = Double.Parse(line.Substring(8,7));

           //If the item isnt already in the collection, add it.
           if (items.Find(delegate(ItemDTO i) { return (i.Item == s); }) == null)
               items.Add(new ItemDTO(s,y));
         }
         catch { /*Crash*/ }
    }
    return items;
}
Run Code Online (Sandbox Code Playgroud)

- 所以我正在努力改进代码(任何提示赞赏).

但它仍然可能是一个缓慢的事情,这是好的,我没有问题,它花了很长时间,只要它不杀死我的服务器.

所以我想要你的好人是:1)我的代码是否可靠地未经优化?2)我可以限制代码块可能使用的CPU数量吗?

干杯全都

Jer*_*fin 10

您可能最好将其设置为空闲优先级,而不是限制其CPU使用率,因此只有在没有任何其他方法可以执行时才会运行.其他人已经提到了优化的可能性,所以我不会尝试进入那个部分.


Chr*_*lor 8

  1. 在列表上执行查找是O(n)操作,这意味着当列表变长时,搜索项目需要更长的时间.您可以考虑将项目放入.NET 4.0/3.5中的HashSet中,或者对早期版本的.NET 使用Dictionary,它可以像索引一样,如果您需要列表中的项目来维护原始顺序,您可以继续放置它们在列表中,但使用HashSet/Dictionary进行检查.

  2. 您还可以在BackgroundWorker线程中运行此代码,这将有助于在进程运行时保持UI响应.