참고 아래 코드는 asp.net에서 가져온 것입니다.닫힌 개체의 가비지 수집
내가
AmazonS3 s3Client = Amazon.AWSClientFactory.CreateAmazonS3Client();
// ...
// details elided
// ...
BackgroundWorker worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler((s, args) =>
{
s3Client.PutObject(titledRequest);
});
new Thread(() => worker.RunWorkerAsync()).Start();
아래 (잘못 작성된) 코드는 가비지 수집기가 백그라운드 작업자가 그것으로 끝날 때까지 결코, 이제까지 s3Client
개체를 수집 할만큼 똑똑 할 것인가가 있다면?
주, 난 단지 내가 직접 배경 노동자를 해고 할 때 발생 asp.net에서 제기됩니다 성가신 오류를 해결하기 위해 스레드 내부의 배경 노동자를 발로하고 있습니다.
정확히. 이것은 GC가 필요한 것입니다. 스레드가 모든 참조를 잃을 때까지 s3client가 유지됩니다! – quetzalcoatl
'RunWorkerAsync()'를 실행하는 데 새 스레드를 시작하는 이유는 무엇입니까? 먼저 비동기 적 방법입니다. 메서드의 내용은 새로운 스레드를 만들고, 조금만 구성한 다음 시작합니다. 백그라운드 스레드에서 그렇게 할 필요는 없습니다. 그렇게함으로써 무의미한 오버 헤드가 추가됩니다. 또한 lambdas를 사용할 때 사용되는 델리게이트를 정의 할 필요가 없으며'new DoWorkEventHandler'를 완전히 제거 할 수 있습니다. 문맥에 따라 암시 될 것입니다. – Servy
@Servy 대리인을 정의 할 필요가 없다는 정보를 주셔서 감사합니다.다른 점은 backgroundWorker를 시작할 때 asp.net이 던져 버리는 엄청난 짜증나는 오류입니다. 주변을 검색하는 것으로부터 간단한 픽스가 아닌 것 같아서, 나는이 싸구려 해결책을 사용했다. –