2009-10-11 41 views
6

Tôi mới đến C# .Tôi đã học được rằng thông thường tất cả các chủ đề là tiền cảnh cho đến khi trừ khi bạn chỉ định rõ ràng nó là "nền" chủ đề sử dụng IsBackGround = true.Bối cảnh chủ đề trong C#

Một số nghi ngờ nảy sinh trong đầu tôi.

1) lợi thế của việc giữ một sợi như sợi nền là gì?

2) Khi thực hiện mã folowing:

static void Main(string[] args) 
    { 
     Thread worker = new Thread(SayHello); 
     worker.IsBackground = true; 
     worker.Start(); 
     Console.WriteLine("Hello From Main"); 
    } 

    static void SayHello() 
    { 
     Console.WriteLine("Hello World"); 
     Console.ReadKey(true); 
    } 

tôi cần phải sử dụng worker.Join() để giữ cho các chủ đề chính để chờ đợi như các chương trình chấm dứt ngay lập tức. Ngoài Join() tôi có thể sử dụng các kỹ thuật khác để giữ cho thread chính chờ đợi?

+3

luồng trong C# là một điều khá thú vị. Tôi rất khuyên bạn nên ClR thông qua C# cuốn sách từ Jeffrey Richter. Ông có một lời giải thích từ các cửa sổ hạt nhân lên như thế nào chủ đề làm việc trong C#. Thật không may, nhiều người trong số các khái niệm này rơi trở lại vào C++ Win32 luồng api. – Spence

+3

Bạn sẽ có nhiều niềm vui hơn với công cụ đồng bộ hóa chủ đề. Có một cái nhìn tại hệ thống.Các lớp Threading.Semaphore, ManualResetEvent, AutoResetEvent, Mutex và Interlocked. THey're tất cả rất hữu ích để làm công cụ luồng. – Spence

+0

Cảm ơn Spence Cảm ơn bạn rất nhiều.Tôi sẽ có một cái nhìn vào nó. – user186973

Trả lời

11

1) Lợi thế của việc giữ chuỗi làm chủ đề nền là gì?

Ưu điểm là Chủ đề nền không ngăn Chương trình chấm dứt. Trong một ứng dụng lớn, nó có thể là một chút khó khăn để vô hiệu hóa tất cả các chủ đề nếu bạn muốn thoát khỏi ứng dụng.

Ngoài Tham gia() tôi có thể sử dụng các kỹ thuật khác để giữ cho chuỗi chính chờ không?

Nếu bạn muốn làm cho chương trình chính chờ đợi tại sao bạn tạo chuỗi chỉ ở vị trí đầu tiên thì ??? Bên cạnh Join() bạn có thể sử dụng EventWaitHandle hoặc Monitor để thực hiện phương thức chính chờ.

6

Tất cả điều đó có nghĩa là liệu luồng này có giữ cho quá trình này còn hoạt động hay không. Nếu tất cả các chủ đề trong quá trình của bạn được đánh dấu nền sau đó. Net sẽ tắt quá trình của bạn và buộc nó để thoát.

Trong câu trả lời cho câu hỏi của bạn, có bạn phải tham gia vì chuỗi trong nền sẽ không giữ cho nó hoạt động, do đó khi khởi động rời khỏi Main() thì nó sẽ cho phép ứng dụng thoát ra.

3

Nếu chuỗi hoàn tất trước khi chương trình kết thúc, thì nó không phải là chuỗi nền.

Có rất nhiều cách để làm cho chủ đề chính của bạn chờ đợi, nhưng trong ví dụ trên tôi nghĩ rằng những gì bạn thực sự muốn làm là để đảm bảo nó không phải là một chủ đề nền.

Join phương pháp thường được sử dụng để đảm bảo rằng chủ đề được thực hiện thực hiện trước khi các thread kêu gọi tiếp tục. Ví dụ, bạn có thể sinh ra 5 luồng mà mỗi luồng thực hiện một số thao tác toán và kết quả của các hoạt động đó có thể cần thiết để tiếp tục với bước tiếp theo. Phương thức Join sẽ tạm dừng thực thi trên chuỗi gọi cho đến khi các luồng sinh ra có thể hoàn thành. Điều quan trọng cần lưu ý là nếu bạn gọi Tham gia từ chuỗi giao diện người dùng, bạn sẽ đóng băng chương trình của mình cho đến khi các chủ đề sinh ra kết thúc.

Trong ngắn hạn, đa luồng thực sự phức tạp và sắc thái. Tôi khuyên bạn nên mua một cuốn sách hay về chủ đề này.

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