c # Класс задачи и утечка памяти - PullRequest
0 голосов
/ 12 июля 2011

У меня есть приложение, которое обрабатывает данные из текстового файла - оно читает строку из файла, затем обрабатывает ее и затем помещает результат в другой файл.После обработки одной строки она обрабатывает следующую, пока весь файл не будет готов.Некоторые строки из файла очень трудоемки для обработки.Поэтому я решил поместить логику обработки в отдельный поток, и если обработка занимает больше 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 ]

1 голос
/ 12 июля 2011

Задача Одноразовая : task.Dispose();

1 голос
/ 12 июля 2011

Ваш тайм-аут только 10 секунд задача .Он не останавливает выполнение Handle() (если оно действительно когда-либо начинается - я не вижу там Start).Это просто означает, что вы локально видите тайм-аут на task.

Кроме того, это частично зависит от того, что делает GetRowsToHandle() - возвращает ли она небуферизованную последовательность илисписок и т. д.

Хотя Task поддерживает поддержку отмены, это требует сотрудничества от реализации.Честно говоря, поскольку вы ничего не делаете асинхронно, вам, возможно, лучше справиться со своим собственным базовым тайм-аутом «я слишком долго» в Handle().Прерывание потока (другой вариант) не рекомендуется.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...