c#任务类和内存泄漏

时间:2011-07-12 12:50:16

标签: c# multithreading memory-leaks

我有一个处理来自文本文件的数据的应用程序 - 它从文件中读取一行然后处理它,然后将结果放入另一个文件中。处理完一行后,它处理下一行,直到整个文件完成。文件中的某些行非常耗时。所以我决定将处理逻辑放在单独的线程中,如果处理时间超过10秒。我杀了线程。所以我的代码是这样的:

public class Handler
{
   public void Handle(string row)
   {
      // Perform handling
   }
}

public class Program
{
   private static bool HandleRow(string row)
   {
      Task task = new Task(() => new Handler().Handle(row));
      task.Start(); // updated
      var waitResult = task.Wait(timeout); // timeout is 10 sec.
      if(waitResult == false || task.IsFaulted)
         return false;
      return true;
   }

   public static void Main()
   {
      foreach(var row in GetRowsToHandle())
         HandleRow(row);
   }
}

但不知何故,当运行该程序时,我的内存异常。看来内存没有正确释放 有谁知道为什么会发生内存泄漏? 已更新
我忘了在我的代码嗅探器中包含task.Start()。现在我把它放在那里

2 个答案:

答案 0 :(得分:1)

你的10s超时仅超过任务。它不会阻止Handle()执行(如果它确实启动了 - 我看不到Start。它只是意味着您本地task上看到超时。

此外,它部分取决于GetRowsToHandle()的作用 - 它是返回非缓冲序列,还是列表等等。

虽然Task 支持取消,但这需要实施方面的合作。说实话,既然你没有做任何异步,你可能会更好地处理你自己的“我花了太长时间”基本超时Handle()。不建议使用线程中止(另一个选项)。

答案 1 :(得分:1)

任务是Disposabletask.Dispose();