2014-07-19 21 views
0

我正在創建一組線程來訪問Web服務並返回值。 我已經將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異常之後返回,有時它會執行並拋出另一個異常,表示線程已中止。還有UpdateDB()運行了兩次。 它是如何運行的,因爲線程已經中止。是否因爲訪問Web服務方法時啓動了另一個線程?

+0

你使用哪個框架類來調用web服務?它是'WebClient'嗎? – dcastro

+0

是的。其Web服務客戶端。 – FatalError

+0

您能向我們展示您實際執行Web請求的行嗎? – dcastro

回答

0

你得到了ThreadAbortException,因爲這就是Thread.Abort所做的。但更重要的是,不要使用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它運行兩次的事實必須由代碼的其他部分來解釋,而不是在問題中顯示。您應該發佈[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve) – dcastro

相關問題