2010-07-22 33 views
6
public void threadMethod() 
{ 
    try 
    { 
     // do something 
    }  
    catch (ThreadInterruptedException e) 
    { 
     Console.WriteLine("[Net]", role, "Thread interrupted."); 
     n.CloseConnection(); 
    } 
    finally 
    { 
     if (isAutenticated == false) 
     { 
      n.CloseConnection(); 
     } 

     Dispatcher.Invoke(addMessage, "Network connection searching was disabled."); 
     DebuggerIX.WriteLine("[Net]", role, "Finished"); 
     Dispatcher.Invoke(threadStoppedDel); 
    } 
} 

Phương pháp threadMethod được chạy qua System.Threading.Thread. Chủ đề có thể bị gián đoạn bất cứ khi nào ngoại lệ ThreadInterruptedException có thể bị ném vào cuối cùng, phải không? Tôi có phải kèm theo khối cuối cùng trong try-catch một lần nữa không?Làm thế nào để xử lý đúng ThreadInterruptedException?

Cảm ơn!

+0

Cách tốt nhất để xử lý nó là không gây ra nó. Không sử dụng ngoại lệ cho việc thay đổi điều khiển luồng của chủ đề của bạn. Sử dụng các tín hiệu luồng chéo được thiết lập tốt như 'ManualResetEvent'. –

Trả lời

7

Một ngoại lệ bị gián đoạn luồng được ném khi chuỗi bị gián đoạn bằng cách gọi thủ công Thread.Interrupt. Bản thân Windows sẽ không làm gián đoạn luồng của bạn bằng cách sử dụng phương thức đó. Nói chung nó sẽ là chương trình của bạn kiểm soát khi một sợi được gửi tín hiệu ngắt (không phải tất cả thời gian). Vì tín hiệu ngắt có thể được sử dụng cho một số điều khiển luồng, nó thường không được gửi hai lần liên tiếp.

ThreadInterruptedException được đưa vào chuỗi bị gián đoạn, nhưng không được cho đến khi chặn chuỗi. Nếu luồng không bao giờ chặn, ngoại lệ sẽ không bao giờ bị ném và do đó luồng có thể hoàn thành mà không bị gián đoạn.

Nếu chủ đề của bạn không bao giờ ngủ hoặc đợi trên các đối tượng khác (nhập trạng thái WaitSleepJoin), bạn sẽ không bao giờ thấy ngoại lệ bị ném.

Bảo vệ chủ đề của bạn vì bạn phải được chấp nhận. Đừng quên rằng một ThreadAbortException có thể được ném quá, và những người có một chút phổ biến hơn và có thể được ném thường xuyên hơn (ứng dụng được tắt, vv).

+0

Phát biểu của 'ThreadAbortException', sẽ không phải là' Dispatcher.Invoke' bế tắc trong một kịch bản tải xuống miền ứng dụng? –

Các vấn đề liên quan