Что происходит с удаленным заданием? - PullRequest
5 голосов
/ 16 декабря 2011

Что происходит с локальной ссылкой на задачу, когда она выходит из области видимости, и сборщик мусора решает избавиться от нее до завершения задачи?

По сути, я спрашиваю, безопасно ли осуществлять реализацию такого вызова службы:

/// <summary>
/// Web service operation to start a large batch asynchronously
/// </summary>    
public StartBatchResponseMessage StartBatch(StartBatchRequestMessage request)
{
  Task t = Task.Factory.StartNew(DoWork);
  return new StartBatchResponseMessage();
}

private void DoWork()
{
  // Implement solving world hunger here.
}

Будет ли DoWork всегда завершать работу в этом примере?Даже если сборщик мусора решит удалить переменную экземпляра Задачи t?

Если нет, то как безопаснее реализовать такую ​​функциональность?

Ответы [ 3 ]

10 голосов
/ 16 декабря 2011

да, он будет запущен. Если вы декомпилируете свой код, вы увидите вызов на Task.Factory.StartNew звонки Task.InternalStartNew, который вызывает Task.ScheduleAndStart(false).

Это, в свою очередь, вызывает task.m_taskScheduler.QueueTask(this),, что в соответствии с MSDN добавляет задачу во внутреннюю структуру, что, конечно же, не позволяет собирать мусор. Это именно то, на что вы надеетесь.

3 голосов
/ 16 декабря 2011

Здравый смысл, вы знаете. Библиотека Task должна каким-то образом вызывать ваш метод, поэтому она должна сохранять ссылку, иначе она не сможет вызвать ее. Так что, очевидно, эта ссылка предотвращает сборку мусора.

По сути, «Задача», которую вы получаете, - это указатель на объект «Задача», на который внутренний механизм выполнения также должен иметь ссылку, иначе он никогда не будет выполнен.

Итак, поскольку есть ссылки ДРУГИЕ от вашей переменной t, она не будет удалена.

1 голос
/ 16 декабря 2011

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

...