2009-06-23 5 views
15

사용중인 블록을 종료하여 해제 된 개체에서 메서드를 실행하는 경우 스레드는 어떻게됩니까?
예 :범위가 지정된 개체에서 여전히 실행중인 스레드가있는 using() 블록을 종료하는 C#

 
    using (SomeObject obj = new SomeObject()) 
    { 
     obj.param = 10 ; 
     Thread newThread = new Thread(() => { obj.Work(); }); 
     newThread.Start(); 
    } 
    ... 

obj.Work() 새로운 스레드에서 실행되지만 OBJ 블록 종료를 사용할 때 일반적으로 출시 얻을 것 인으로 IDisposable 개체입니다. 사용 블록이 끝난 후 스레드가 계속 실행되면 어떻게됩니까? 스레드가 완료된 후에 만 ​​객체가 삭제됩니까? 아니면 실이 끊어 질까요?

감사합니다.

+0

스레드 외부에서 using 문을 사용하는 대신 스레드 안에 넣습니다. 스레드 newThread = 새로운 스레드 (() => {obj.param = 10 사용 (OBJ = SomeObject의 새로운 SomeObject의()) { ; obj.Work(); }}); newThread.Start(); – Relster

답변

4

IDisposable은 단지 패턴 일 뿐이며 개체와 관련된 메모리를 해제하지 않습니다. 이 경우 using 블록을 닫으면 obj.Dispose이 호출되고 obj을 사용하는 다른 스레드는 계속 실행됩니다.

다른 스레드가 사용하는 동안 obj's 상태가 변경 될 수 있으므로 (이는 모두 Dispose 메서드가 구현 된 방식에 따라 다름) 이상한 문제가 발생합니다. 말할 필요도없이 IDisposable, 스레딩 및 using 진술은 문제가 될 수 있습니다.

1

주 스레드에서 사용 블록을 종료하면 개체를 .Dispose()하여 모든 종류의 재미있는 동시성 문제를 일으킬 수 있습니다. 그러나 객체는 가비지 수집되지 않습니다.이 객체는 .Dispose() 구현에 따라 유효하지 않은 상태로 유지됩니다.

11

재미있는 일이 발생할 것입니다.

특히, SomeObject의 dispose 메서드는 Work가 호출되기 전이나 후에 호출됩니다. 그 시점에서 실행되도록 예약되었거나 예약되지 않았을 수 있습니다.

그런 다음 SomeObject의 처리 방법에 따라 다릅니다. 말하자면 'Work'에서 사용되지 않는 SqlConnection을 출시한다면 문제가 없어야합니다. 그러나 SomeObject가 처리되지 않았다고 예상하는 경우 해당 스레드에 예외가 발생했을 수 있습니다.

+0

재미있는 것, 좋은 것. – Groo

+0

웬일인지, 그것은 이탈리아 직업의 Mos Def를 생각하게한다 : "나는 나쁜 경험을했다." –

2

개체는 블록 끝에서 Dispose를 호출합니다. 그것은 계속 실행되지만 Dispose는 연결을 닫는 것으로 가정하기 때문에 obj가 불안정 해집니다. obj가 설정되어있어 무언가가 사용 중인지 확인한 후 나중에 닫을 수는 있지만 가능하지 않습니다. 이것을 처리 할 객체를 작성했습니다.

관련 문제