2013-01-31 40 views
8

Theo mặc định, nhóm luồng trong .NET hoạt động với các chủ đề nền.Tôi có thể tạo nhóm Chủ đề của mình tạo chủ đề làm tiền cảnh không?

Tôi không thể thay đổi để chạy dưới dạng tiền cảnh.

Làm cách nào để thay đổi điều này để chạy làm chủ đề tiền cảnh?

Edit:

tôi cần phải sử dụng này bởi vì tôi đang thay đổi App do xử lý số lượng lớn của tôi (trước khi nó tôi đã tự xử lý chủ đề, đó là những Foreground theo mặc định), và tôi không muốn thay đổi ứng dụng của tôi chỉ để thích nghi với nó vào một kịch bản nền luồng ..

tôi đang tự hỏi tại sao hồ bơi chủ đề không foreground theo mặc định

+3

Bạn muốn chúng được đặt nền trước để ngăn quá trình chấm dứt? Bạn có thể giữ một số tham chiếu về số lượng chủ đề nền hoạt động mà bạn có không chấm dứt chuỗi chính (có lẽ là tiền cảnh, giao diện người dùng) cho đến khi số đếm đạt đến 0. –

+3

@jeffamaphone +1. Mùi như "Tôi không biết làm thế nào để chương trình đó đúng cách, vì vậy tôi lấy một cái búa và bằng cách nào đó làm cho nó hoạt động, lạm dụng tất cả mọi thứ tôi không biết". – TomTom

+0

Vâng, tôi không muốn giả định quá nhiều, nhưng tôi thích các câu hỏi bao gồm * tại sao * bạn muốn làm điều gì đó, vì thường xuyên có một cách tốt hơn đến từ kinh nghiệm. –

Trả lời

16

Các khái niệm về một "sợi nền" có nghĩa là rất chút trong .NET. Các Thread.IsBackground bất động sản chỉ là một lá cờ đơn giản giúp CLR quyết định có hay không nên thô sơ hủy bỏ các chủ đề khi AppDomain được dỡ bỏ hoặc cho dù nó nên chờ cho thread để thoát khỏi tự nguyện.

Bạn chỉ có thể thay đổi thuộc tính nếu bạn muốn một luồng thread-pool tiếp tục chạy khi thoát chương trình. Đoạn mã này hiển thị cách có thể:

using System; 
using System.Threading; 

class Program { 
    static void Main(string[] args) { 
     var sync = new ManualResetEvent(false); 
     ThreadPool.QueueUserWorkItem((_) => { 
      Console.WriteLine("Running"); 
      Thread.CurrentThread.IsBackground = false; 
      sync.Set(); 
      Thread.Sleep(5000); 
      Console.WriteLine("Done, should exit now"); 
      Thread.Sleep(250); 
     }); 
     sync.WaitOne(); // Ensures IsBackground is set 
    } 
} 

Đừng để mắt đến đây. Nếu điều này quan trọng với bạn thì có khả năng cao là bạn đang làm điều gì đó sai.

0

tôi không tin bạn có thể, bạn sẽ phải đưa ra một tùy chỉnh ThreadPool để làm điều này.

Chủ đề trong nhóm chủ đề được quản lý là chủ đề nền. Nghĩa là, các thuộc tính IsBackground của chúng là đúng. Điều này có nghĩa rằng một ThreadPool thread sẽ không giữ cho một ứng dụng đang chạy sau khi tất cả các chủ đề foreground đã thoát.

Khi Không để sử dụng bài viết Pool Chủ đề

Có một số tình huống trong đó nó là thích hợp để tạo ra và quản lý chủ đề của riêng bạn thay vì sử dụng thread hồ bơi:

  • Bạn đòi hỏi một chủ đề tiền cảnh.

From this link And This One

2

Bạn có thể đặt chuỗi chủ đề cho chủ đề là tiền cảnh.

class Program 
{ 
    static void Main(string[] args) 
    { 
     new Action(() => Worker()).BeginInvoke(null,null); 

     Thread.Sleep(1000); 
     Console.WriteLine("Main ends here"); 
    } 

    static void Worker() 
    { 
     Thread.CurrentThread.IsBackground = false; 

     Console.WriteLine("Worker started. Bg {0} Tp {1}.", 
      Thread.CurrentThread.IsBackground, 
      Thread.CurrentThread.IsThreadPoolThread); 

     Thread.Sleep(5000); 
     Console.WriteLine("Worker ends here"); 
Các vấn đề liên quan