2014-03-04 98 views
0

我現在正處於DLL地獄中,試圖讓我的代碼在不同的應用程序框架內工作。在最長的時間裏,我試圖瞭解爲什麼我的方法在被明確排入ThreadPool時未被調用。如何判斷ThreadPool線程是否無聲無息地死亡

它最終證明是一個特定的DLL必須與調用方法位於同一個文件夾中,或者未能找到它,ThreadPool線程會死亡或無聲無息地放棄工作(如忍者)。

顯然,解決方案編譯完美,並沒有錯誤,因爲正在構建的DLL,只是爲了不同的文件夾。這不是第一次由於錯誤放置的DLL而導致ThreadPool線程在我身上無聲無息地死亡。

  1. 當我的線程消失時,究竟發生了什麼?
  2. 我怎麼知道這在未來發生?有沒有可能的日誌文件?

某些代碼:

protected void Enqueue() 
{ 
    try 
    { 
     Task.Run(() => Process()); 
    } 
    catch (Exception ex) 
    { 
     // Logging code here (no issues) 
    } 
} 

protected void Process() 
{ 
    // A breakpoint here will never be called 

    try {  
     // Code that calls into offensive DLL 
    } 
    catch (Exception e) 
    { 
     // Logging code 
    } 
} 
+1

您是否嘗試在工作線程入口函數週圍放置try/catch,並記錄錯誤以查看未處理的可能會導致線程死亡的異常? – LB2

+2

訂閱Application.ThreadException .... http://stackoverflow.com/questions/8836766/c-sharp-catching-exception-which-is-occuring-on-threadpool ---- http://stackoverflow.com/questions/5714520/why-exceptions-raised-on-threadpool-thread-not-handling-by-main-thread-in-cs –

+0

@ LB2不應該推翻這個過程嗎? –

回答

0

假設過程包含該呼叫到DLL。如果是這樣,則會在進程的JIT上引發異常,因此您無法在Process中捕獲它。在調用DLL以確保能夠記錄它之前,再使用一個間接層。

protected void Enqueue() 
{ 
    try 
    { 
     Task.Run(() => Process()); 
    } 
    catch (Exception ex) 
    { 
     // Logging code here (no issues) 
    } 
} 

protected void Process() 
{ 
    try { 
     Process2(); 
    } 
    catch (Exception e) 
    { 
     // Logging code 
    } 
} 

protected void Process2() 
{ 
      // Code that calls into offensive DLL 
} 
+0

謝謝!讓我感到困惑的是,這個DLL中包含的靜態方法不僅被編譯,甚至可以工作,而實例方法拋出了MissingMethodExceptions。我不認爲JIT編譯器對這兩者進行了區分。 – Crystal

+0

如果你正在獲取MissingMethod而不是找不到,那麼你可能會在另一個版本的DLL中找到(比如PATH)。 – Joshua