2010-03-12 39 views
5

Cách tốt nhất để hoàn thành một ứng dụng đa luồng theo cách sạch sẽ là gì?
Tôi đang bắt đầu một số kết nối ổ cắm từ sợi chính trong các ổ cắm riêng biệt và đợi cho đến khi kết thúc ngày làm việc của tôi trong luồng chính và sử dụng hiện tại System.Environment.Exit(0) để chấm dứt nó.Đa luồng - Chiến lược dọn dẹp ở cuối chương trình

Điều này dẫn đến một ngoại lệ không được giải quyết ở một trong các trẻ em. Tôi có nên dừng các chủ đề từ danh sách không? Tôi đã miễn cưỡng thực hiện bất kỳ điểm dừng chân thực sự nào trong các đứa trẻ, vì vậy tôi tự hỏi về cách thực hành tốt nhất. Các ổ cắm tất cả được bọc độc đáo với các bộ hủy thích hợp để đăng xuất và đóng, nhưng nó vẫn dẫn đến lỗi.

Trả lời

2

Đối với đề manualy tạo bạn nên đặt IsBackground bất động sản đúng. Trong trường hợp này (nếu tất cả các chủ đề của bạn ngoại trừ chủ đề chính) sẽ là nền, ứng dụng của bạn sẽ được đóng lại một cách duyên dáng sau khi trở về từ hàm Main (string [] arg).

P.S. Tất cả các luồng Thread đều là nền.

+5

Làm cho tất cả các chủ đề nền của chủ đề công nhân của bạn có thể tránh được bất kỳ tiếng kêu chết nào khi quá trình thoát ra, nhưng nó hầu như không duyên dáng. Chủ đề nền được chấm dứt, ngay cả khi họ đang ở giữa làm một cái gì đó, một khi tất cả các chủ đề tiền cảnh đã kết thúc. – OldFart

+0

Tôi đã thực hiện điều này và tôi sẽ kiểm tra nó thứ hai. – weismat

+0

Được thử nghiệm và làm việc như một người say mê. – weismat

0

Bất cứ khi nào bạn chờ đợi lâu bị chặn (chẳng hạn như chờ kết nối đến), hãy sử dụng biểu mẫu Bắt đầu/Kết thúc của phương thức. Sau đó, sử dụng ManualResetEvent để trình bày điều kiện 'nên thoát'. Sau đó chặn trên AsyncWaitHandle và sự kiện thoát. Điều này sẽ cho phép bạn chấm dứt sạch sẽ.

Ví dụ:

// exit is a ManualResetEvent 
var asyncResult = socket.BeginAccept(null, null); 
if(WaitHandle.WaitAny(new[] { exit, asyncResult.AsyncWaitHandle }) == 0) 
    return; 
var connection = socket.EndAccept(asyncResult); 

Và trong phương pháp chính của bạn khi bạn muốn thoát khỏi:

exit.Set(); 
Các vấn đề liên quan