2011-06-25 30 views
6

Tôi tiếp tục đọc mã và ví dụ về các ứng dụng đa luồng. Thỉnh thoảng tôi thấy một đoạn như sau:Tôi có nên giữ một tham chiếu đến một chuỗi khi nó bắt đầu?

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.WriteLine("started"); 
     Go(); 
     Console.WriteLine("press [ENTER] to quit"); 
     Console.ReadLine(); 
    } 

    private static void Go() 
    { 
     var thread = new Thread(DoSomething); 
     thread.Start(); 
    } 

    private static void DoSomething() 
    { 
     Console.WriteLine("doing something"); 
    } 
} 

Và điều này khiến tôi bận tâm: tôi có nên giữ nguyên tham chiếu đến (tiền cảnh) ở đâu đó không? Xét cho cùng, đó là biến cục bộ bên trong phương thức Go. Do đó, khi việc thực thi Go hoàn tất, tham chiếu luồng phải được thu gom rác. Vì vậy, có lẽ, chỉ có thể, các chủ đề sẽ được GCed trong khi nó thực hiện?

Câu trả lời có thay đổi nếu đó là chuỗi nền không?

Cảm ơn trước!

Trả lời

4

Một chủ đề là một ví dụ của một đối tượng có tuổi thọ là không điều khiển bởi các bộ thu rác. Dưới mui xe nó là một đối tượng hệ điều hành. Đó là còn sống miễn là một thread đang chạy mã. Lớp Thread chỉ là một trình bao bọc cho nó. Một ví dụ khác là một cửa sổ, nó còn sống miễn là mã của bạn hoặc người dùng không đóng nó. Winforms không yêu cầu bạn giữ một tham chiếu đến trình bao bọc lớp Form. Và bạn rất thường không:

Application.Run(new Form1()); 

là mã đĩa nồi hơi, bạn không giữ tham chiếu đến cá thể lớp Form1 ở bất kỳ đâu.

Bạn luôn có thể tạo lại đối tượng Thread từ một chuỗi đang chạy. Bạn làm như vậy với Thread.CurrentThread. Và nó không phải là một luồng mà bạn đã tạo với hàm tạo Thread. Nó có thể được sử dụng bên trong một thread threadpool. Hoặc một chuỗi không được bắt đầu bằng mã được quản lý. Các chủ đề chính của chương trình của bạn sẽ là một ví dụ tốt về điều đó, nó đã được bắt đầu bởi Windows.

Tuy nhiên, việc mất tham chiếu đến chuỗi không phải là phương pháp hay. Nó ngụ ý rằng bạn không thể kiểm tra xem nó vẫn đang chạy. Điều này ngụ ý rằng bạn không thể dừng nó khi nó dừng lại. Ví dụ: khi người dùng muốn thoát khỏi chương trình của bạn.

2

Theo this answer, bạn không có gì phải lo lắng. GC là đủ thông minh để biết nếu một sợi đang được sử dụng.

Dưới đây là một bài viết giải thích các hành vi: http://msdn.microsoft.com/en-us/magazine/bb985011.aspx#ctl00_MTContentSelector1_mainContentContainer_ctl03

+0

là đúng. Không có gì phải lo lắng bởi vì một luồng là một gốc GC. –

+0

Cảm ơn câu trả lời. Bất kỳ cơ hội nào để tham khảo tài liệu về điều này? –

+0

Chắc chắn, tôi đã thêm một tham chiếu. –

2

Bạn chỉ cần giữ chân các tài liệu tham khảo nếu bạn muốn sử dụng nó sau này. Trong trường hợp này, bộ sưu tập rác sẽ không khởi động cho đến khi luồng hoàn tất.

Sự khác biệt duy nhất giữa chủ đề nền trước và nền là một luồng tiền cảnh giữ cho môi trường thực thi được quản lý đang chạy.

Điều này có nghĩa là chuỗi chạy nền trước sẽ ngăn ứng dụng của bạn đóng, trong khi nền không chạy.

Source

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