BackgroundWorker и управление ресурсами в c # - PullRequest
0 голосов
/ 21 марта 2011

Давайте предположим, что я создаю фоновый рабочий в форме как компонент. И запускаю его. Теперь, если я закрою форму, BackgroundWorker все еще будет работать. Вы объясните, что форма закрыта, а все ресурсы, созданные внутри объекта формы, закрыты, но BackgroundWorker все еще работает. Что является причиной этого? Это из-за того, что он запускается в другом потоке. И когда его ресурсы будут возвращены CLR.

Ответы [ 3 ]

1 голос
/ 21 марта 2011

Фоновый рабочий по умолчанию не связан с формой или потоком, в котором он создан.

Фоновый работник - это объект, как и любой другой объект. Он будет собран, когда на него больше не будет активных ссылок.

Так что это действительно зависит от того, как и где был создан объект, и в основном - у кого еще есть ссылки на него.

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

Примечание:

Form.Close () удаляет диалог из поля зрения и вызывает методы Closing () и Closed (). Вы все еще можете получить доступ к форме и вернуть ее позже.

Form.Dispose () уничтожает диалоговое окно и освобождает его ресурсы обратно в операционную систему. Он не вызывает методы Closing () и Closed () формы. После утилизации вы не можете вспомнить форму. Dispose () также вызовет метод Dispose () всех компонентов формы.

1 голос
/ 21 марта 2011

Фоновый работник будет удален с формой, если вы намеренно не подавите распоряжение. Если это так, то мусор следует собирать в неопределенное время. Я должен сказать, потому что вещи потенциально могут содержать ссылку на фонового работника. Что касается потока, я считаю, что он будет очищен в dispose, который следует вызывать из формы, когда он закрывается.

Если форма является основной, а при закрытии основной поток переднего плана закрывается, то все фоновые потоки также закрываются / умирают.

0 голосов
/ 21 марта 2011

Когда вы закрываете форму и утилизируете ее, BackgroundWorker также удаляет ее, но не останавливает работу потока. Таким образом, он будет полностью уничтожен только после завершения работы DoWork.

Вы можете решить эту проблему, отменив закрытие формы и вызвав CancelAsync в фоновом режиме, чтобы сообщить, что вы хотите, чтобы он закончил. Подождите, пока он не закончится, и только после этого вы должны фактически закрыть форму.

...