2009-07-16 9 views
0

이 코드는 다음과 같습니다.Compact Framework 2.0 : 개체를 처리 할 때 스레드를 중지하려면 어떻게합니까?

Thread t = new Thread(() => UpdateImage(origin)); 
t.Name = "UpdateImageThread"; 
t.Start(); 

이 코드는 사용자 지정 컨트롤에서 만들어졌습니다. 개체가 처분 될 때이 스레드 (실행중인 경우)를 중지하고 싶습니다.

이 사용자 지정 컨트롤은 다음과 같은 방법이 있습니다.

void IDisposable.Dispose() 
{ 
    /* My own code */ 
    base.Dispose(true); 
} 

이 코드를 넣을 수 있지만 있지만 생각합니다.

스레드가 실행 중인지 어떻게 알 수 있습니까? 스레드에 대한 referece를 가져와 중지하려면 어떻게해야합니까?

그건 그렇고, UpdateImage는 웹 서비스를 호출하기 때문에 그것이 모든 삶을 기다리고 있다고 생각합니다. 어떻게이 대기를 끝낼 수 있습니까?

고맙습니다!

답변

1

UpdateImage()의 기능과 아직 사용중인 이미지에 얼마나 잘 대응하고 있는지에 따라 많이 달라집니다. UpdateImage()이 코드이고 루프가 있으면 _stopping과 같은 필드를 사용하여 중지하도록 알릴 수 있습니다. 그렇지 않은 경우 가장 좋은 방법은 아무 것도하지 않는 것입니다. 이미지가 여전히 업데이트되는 동안 컨트롤을 삭제하는 드문 경우에서 GC로 남겨 두어야하는 불이익을 감수해야합니다.

스레드를 얻는 방법 : 참조를 저장할 위치와 위치를 저장하면됩니다 (예 : int int private member _updateThread).

이제 실제로 스레드를 중지 (중단)하는 것은 매우 나쁜 생각입니다.

그래서 당신은

private bool _stopping = false; 

같은 지표가 필요합니다 그리고 그것은 _stopping == true에 반응하고 무엇을하고 있는지와 중지 UpdateImage() 방법에 달려있다.

당신의 폐기는() 나는 당신의 사용자 지정 컨트롤의 Dispose 메서드를 오버라이드 (override)하는 것이 좋습니다

_stopping = true; 
_updateThread.Join() 
+0

UpdateImage 방법은 웹 서비스 요청을 수행하고 내가 그것을 중지하는 방법을 모르겠어요. 비동기 일 수도 있습니다 ... – VansFannel

0

사용할 수 있습니다. 스레드의 참조가 있습니다. 예를 들어 .Join()을 호출 할 수 있습니다 ...

1

스레드 변수 't'를 나중에 다시 사용할 수 있도록 저장하십시오. 당신의 폐기 방법 내에서

당신은 뭔가를 원하는 :

void IDisposable.Dispose() 
{ 
    if(t.IsRunning) 
    { 
     cancelThreads = true; // Set some cancel signal that the thread should check to determine the end 
     t.Join(500); // wait for the thread to tidy itself up 
     t.Abort(); // abort the thread if its not finished 
    } 
    base.Dispose(true); 
} 

당신은 당신이 전에 스레드가 중지하도록 허용하지 않습니다 지역 내 코드의 임계 영역을 배치 할 수 있도록,하지만 스레드를 중단 조심해야한다 끝난 경우 ThreadAbortExceptions를 잡아서 아무 것도 정리하지 못하게합니다.

당신은 방법 시작 스레드에서이 같은 작업을 수행 할 수 있습니다

public void DoWork() 
{ 
    try 
    { 
     while(!cancelThreads) 
     { 
     // Do general work 

     Thread.BeginCriticalRegion(); 
      // Do Important Work 
     Thread.EndCriticalRegion(); 
     } 
    } 
    catch(ThreadAbortException) 
    { 
     // Tidy any nastiness that occured killing thread early  
    } 
} 
+0

그리고 ... 웹 서비스 요청을 중단하는 것은 어떨까요? – VansFannel

+0

IsRunning, BeginCriticalRegion 및 EndCriticalRegion은 Compact Framework 2.0과 호환되지 않습니다. – VansFannel

+0

죄송합니다. 나는 소형 부품을 발견하지 못했습니다. 죄송합니다. 이 경우 단순히 각 스레드에 대해 설정하는 플래그가 있어야합니다 (이를 수행하는 데 사용자 정의 래퍼 클래스가 필요할 수 있음). 중요 영역 시작과 끝은 ThreadAbortException에서 중요한 모든 것이 유효한지 확인하는 것입니다. – Ian

관련 문제