2014-07-19 5 views
0

웹 서비스에 액세스하고 값을 반환하는 스레드 세트를 생성합니다. threading.timer의 타임 아웃 타이머가 초과하면 각 스레드에 threading.timer를 추가하고 스레드가 사용하는 리소스를 할당 해제하려고했습니다.스레드가 멈추거나 실행을 완료하는 데 너무 많은 시간이 걸리는 경우 스레드 자원 할당 취소

내가 어떻게 그랬는지.

class ThreadTest 
    { 
     System.Threading.Timer ThreadTimeoutTimer = null; 
     private void ThreadStartMain() 
      { 

     ParameterizedThreadStart start = new ParameterizedThreadStart(new ThreadTest().ReadData); 
       Thread t = new Thread(start); 
       t.Start(); 
      } 

     public void ReadData(object stat) 
     { 
      int _timeOutTimer = 60000; 

      Thread currentThread = Thread.CurrentThread; 
      ThreadTimeoutTimer = new System.Threading.Timer(ReleaseThread, currentThread, _timeOutTimer, Timeout.Infinite); 

      webservcieclient webcl = new webservcieclient(); 
      webcl.GetData(); 

      ThreadTimeoutTimer = null; 
      UpdateDB(); 
     } 

     private void ReleaseThread(object state) 
     { 
      Thread runningThread = (Thread)state; 
      if (runningThread.IsAlive) 
      { 
       runningThread.Abort(); 
      } 
     } 
    } 

어떻게 작동하는지 확인하려면 webservcieclient가 시간 초과 시간을 초과했습니다. 타이머가 시작되고 스레드가 중단됩니다.

그렇다면 webservcieclient가 네트워크/http 예외 다음에 반환되는 경우가 있으며 실행 된 후 스레드가 중단되었음을 알리는 또 다른 예외가 throw됩니다. 또한 UpdateDB()가 두 번 실행되었습니다. 스레드가 이미 중단 되었기 때문에 실행 방법. 웹 서비스 메서드에 액세스하는 동안 다른 스레드가 시작 되었기 때문입니까?

+0

webservice를 호출하는 데 사용하는 프레임 워크 클래스는 무엇입니까? 그것은'WebClient'입니까? – dcastro

+0

예. 그것의 웹 서비스 클라이언트. – FatalError

+0

실제로 웹 요청을 실행 한 행을 표시 할 수 있습니까? – dcastro

답변

0

Thread.Abort이 있기 때문에 ThreadAbortException이 표시됩니다. 더 중요한 것은 Thread.Abort을 사용하지 마십시오!

은 참조 :

당신이 당신의 스레드를 취소 할 수있게하려면 What's wrong with using Thread.Abort(), 당신은 TPL의 작업과 CancellationToken 같은 높은 수준의 구조를 사용한다. 다음은 간단한 예입니다.

public void Main() 
{ 
    //create a token that will be automatically cancelled after 60000 seconds 
    var cts = new CancellationTokenSource(60000); 

    Task task = Task.Run(() => ReadData(cts.Token)); 
} 

private void ReadData(CancellationToken token) 
{ 
    while (! token.IsCancellationRequested) 
    { 
     //do something 
    } 
} 
+0

하지만 어째서 그렇게됩니까? 스레드가 이미 중단 되었기 때문입니다. 약 120 초 후에 발생하기 때문에 네트워크 예외입니다. 그래서 내 질문은 스레드가 이미 두 번 실행 방법을 중단 한 경우입니다. updateDB()는 두 번 호출합니다. – FatalError

+0

@FatalError 코드가 두 번 실행된다는 사실은 코드의 다른 부분으로 설명해야합니다 (질문에 표시되지 않음). 당신은 [Minimal, Complete, and Verifiable example] (http://stackoverflow.com/help/mcve)을 게시 했어야합니다. – dcastro