Когда завершается задача C #? - PullRequest
0 голосов
/ 27 ноября 2018

Я работаю с ASP.NET.Когда я запускаю новую задачу, в какой момент эта задача будет завершена?Будет ли он завершен, когда поток, вызвавший его, завершится?Или будет продолжаться до тех пор, пока не завершит выполнение кода в моем лямбда-выражении?

Вот пример того, что я пытаюсь сделать:

Task.Run(() =>
{
    try
    {
        MyFunction();
    }
    catch (Exception ex)
    {
        Console.Write(ex);
    }
});

MyFunction () не возвращаетчто угодно, я просто хочу, чтобы он запускался сам по себе, чтобы текущий поток мог продолжаться.Когда я запускаю свое приложение и вызываю этот код, кажется, что он работает нормально.Я просто пытаюсь понять, стоит ли мне беспокоиться о самопроизвольном завершении задачи или у меня все будет хорошо.

Я также должен упомянуть, что поток, выполняющий запрос, вероятно, завершится до завершения Задачи..

Спасибо.

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

A Task может иметь или не иметь поток, но в вашем случае Task.Run это должно быть.Вы можете ссылаться на сам Task, и он будет существовать до тех пор, пока он находится в области действия, или вы сохраняете живую ссылку на него.Поток, с которым он работает, будет продолжаться до завершения кода.Это немного сбивает с толку, но знаю, что сам Task и работающий поток разделены.Task больше похож на состояние / менеджера некоторой работы, которая может быть или не быть в отдельном потоке.Эта ссылка может храниться до тех пор, пока приложение не прекратит работу, если это необходимо, где вы можете прочитать состояние работы, даже если она завершена.

Если Task покидает область видимости и отсутствует ссылка, то отслеживаемая единица работы будет продолжена;однако сам Task будет настроен для сборки мусора, когда это будет завершено.Другими словами, вы можете запустить и забыть Task, если хотите, и если не возникнет ошибка или вы не завершите приложение, единица работы, назначенная для Task, будет завершена.

Обратите внимание, что Task завершится с вашим приложением, и если этот Task вызовет новый поток, такой как вы делаете с Task.Run, он также завершится с вашим приложением, если приложение завершится.

0 голосов
/ 27 ноября 2018
  1. Задание завершает свою жизнь вскоре после того, как оно завершает выполнение кода, с которым была поставлена ​​задача.

  2. Когда задача выходит из области видимости, она в конечном итоге будет очищена сборщиком мусора, при условии, что не осталось кода для выполнения

И наконец, нет веской причины, по которой задачи должны внезапно завершаться, если исключение не выдается и не может быть перехвачено.

.net.Не бросает кубики, чтобы завершить задачу, иначе они будут бесполезны.Они живут столько, сколько им нужно, чтобы жить и завершиться вскоре после

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

https://docs.microsoft.com/en-us/dotnet/standard/parallel-programming/task-based-asynchronous-programming

...