none
關於Thread無回應的問題 RRS feed

  • 一般討論

  • 請教各位先進, 小弟開發一套使用多執行緒的服務, 執行一段時間後, 常遇到一些令人不解的問題

    有時當執行緒執行到 Array.Copy, 或 Object Clone, 又或者 Random.Next() 之類的方法

    執行緒看似沒有回應了, 由於多緒不易追蹤, 我只是在程式沒有回應時, 將沒有回應的 Thread 給 abort

    接著得到的 exception 的訊息大致上如下

    at System.Array.Copy(Array sourceArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length, Boolean reliable)
       at System.Array.ConstrainedCopy(Array sourceArray, Int32 sourceIndex, Array destinationArray, Int32 destinationIndex, Int32 length)

    A first chance exception of type 'System.Threading.ThreadAbortException' occurred in xxx.dll

    我對 thread 要執行的 code 都有 try catch, 但每次發生無回應的問題時, 總是要將 thread abort 後才捕捉到錯誤

    乍看之下就好像 thread 執行到 Array.Copy 時, 就在這道指令上 lock 住了

    不曉得是否有人遇過相同的問題, 或者可否提供些偵錯的建議

    感謝

    2012年10月19日 下午 07:15

所有回覆

  • (1) 你在 Thread 中 Method 中 Catch 到例外時做了什麼處理 ?

    (2) 我常常在 Thread 中使用 Array.Copy , 大部份會出錯的狀況都是因為陣列長度不正確造成

    (3) 是否同時有多個 Thread 呼叫同一個記憶體位址的方法 ?


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年10月20日 上午 01:47
    版主
  • 您好, 感謝回覆

    (1) 捕捉到exception後, 只是 Debug.Print exception message而已

    (2) 由於狀況是偶發, 而且發生時也來不及監控變數的狀況. 所以不清楚是否有長度不正確的問題, 但若是長度不正確, 相信 try catch 一定能捕捉錯誤, 小弟的問題是 try catch 實際上並未觸發, 而是等到我將 thread abort 後才發生 ThreadAbortException, 然後才知道原來剛剛 thread 停在 Array.Copy 這一行(最新狀況, 不只 Array.Copy 連 decimal.ToString() 都發生過)

    (3) 這問題小弟已嘗試避免, 尤其是標記為 none thread safe 的 class 或 method, 使用前我都會先 lock, 例如 Random.Next, 而前提的 Array.Copy, Source Array 跟 Destination Array 我能肯定當下只有單一執行緒在操作

    目前 Array.Copy 我將之改寫用 For Loop 自行複製陣列元素, 暫時沒出現問題

    另外也擔心小弟的問題表達不清楚, 簡單說明一下, 底下的範例, try catch 是在 function 之外

    private void threadprocedure(object data){

    Client oClient = (Client)object;

    char[] newarray = new char[oClient.oldarray.Length];

    Array.Copy(oClient.oldarray, 0, newarray, 0, newarray.Length);

    for(int i=0;i<newarray.Length;i++){

    ....do something

    }

    }

    小弟指的問題是, 當執行到 Array.Copy 這一行, 沒發生 exception, 但也不會執行接下來的 for loop, 執行緒好像就卡在 Array.Copy, 直到我將 thread abort 之後才捕捉到 exception, 而該 exception 的 call stack 可看到 at System.Array.Copy ...., 卻沒有明確的訊息例如 index out of bounds 之類, 所以令人費解, 也懷疑 thread 卡在 .NET 底層程式中, 但想歸想, 也無法去追蹤

    Visual Studio 中可以觀察各 Thread 的執行狀況, 但對這問題並無幫助, 或者是否有更好的方法, 適用於 multithread debug

    盼各位先進不吝指教

    2012年10月20日 上午 02:54
  • 如果有懷疑的話,
    threadprocedure裡面,只留下Array.Copy測試看看。

    有可能是打死結了,光從程式片面來看
    有能的問題有:
    1. Client是否有lock? 
    2. do something 是否有lock? 
    3. ....
    把這些問題點一一排除,應該就能找到真正的問題點 :D

    學無止境

    2012年10月20日 上午 04:49
  • 可以貼上整個 execption 嗎 ?

    我寫多緒程式寫很久了,  從來沒見過什麼 Thread 會卡在 .Net 底層之類的說法.


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。

    2012年10月20日 上午 04:51
    版主