2010-10-04 38 views
5

Tôi có một ứng dụng bàn điều khiển C# có một số chủ đề để thực hiện một số công việc (tải xuống một tệp). mỗi luồng có thể thoát ứng dụng bất kỳ lúc nào trong ứng dụng, nhưng tôi sẽ hiển thị thông báo thích hợp trên bảng điều khiển. Có thể theo dõi chúng nhưng nó không có ý nghĩa với tôi. Tôi chỉ đơn giản là kiểm tra số lượng thread hoặc một cái gì đó như thế để tìm ra cái nào là chủ đề cuối cùng và làm điều gì đó khi nó đang thoát. Cách tốt nhất để làm như vậy là gì?Chủ đề cuối cùng của ứng dụng đa luồng

mã giả:

if (lastThread) 
{ 
    cleanUp(); 
    Console.ReadLine(); 
} 

Cảm ơn

+1

Bạn đang sử dụng phiên bản C#/.NET nào? –

+0

Tôi có thể sử dụng bất kỳ phiên bản – Xaqron

Trả lời

11

Đây là một nơi mà sử dụng Task mới Thư viện song song có thể làm cho cuộc sống dễ dàng hơn nhiều. Thay vì tạo chủ đề, và quay công việc lên trên thread, bạn có thể sử dụng nhiều nhiệm vụ:

var task1 = Task.Factory.StartNew(() => DoTaskOneWork()); 
var task2 = Task.Factory.StartNew(() => DoTaskTwoWork()); 
var task3 = Task.Factory.StartNew(() => DoTaskThreeWork()); 

// Block until all tasks are done 

Task.WaitAll(new[] {task1, task2, task3}); 
cleanUp(); // Do your cleanup 

Nếu "nhiệm vụ" chỉ là tải một loạt các tập tin cá nhân, thậm chí bạn có thể làm điều này đơn giản hơn sử dụng PLINQ:

var fileUrls = GetListOfUrlsToDownload(); 

fileUrls.AsParallel().ForAll(fileUrl => DownloadAndProcessFile(fileUrl)); 

cleanUp(); // Do your cleanup 
+0

+1 giả sử họ đang sử dụng .NET 4.0. –

+0

+1 cho giải pháp đơn giản và dễ cháy hơn –

+1

@Mark: Tôi không giả sử chúng là - nhưng nếu không, tôi muốn cung cấp động lực để di chuyển;) –

1

chủ đề chính của bạn nên join với chủ đề người lao động của bạn và ngăn chặn trong khi họ đang chạy. Sau đó, khi tất cả các chủ đề được hoàn thành, nó thực hiện mã dọn dẹp và sau đó thoát.

Hoặc bạn có thể sử dụng WaitHandle chẳng hạn như ManualResetEvent cho mỗi chủ đề và wait for all trong số đó để được báo hiệu.

+0

Có nhiều vị trí khác nhau nơi chuỗi để lại mã. Thật khó để làm cho họ trở lại một số nơi và tham gia cùng họ – Xaqron

2

Thiết kế mà bạn mất theo dõi chủ đề của mình không lý tưởng.

Tùy thuộc vào cách bạn sinh ra chúng, nên có khả năng theo dõi trạng thái của từng bằng cách kết hợp một số đối tượng tín hiệu cho mỗi luồng, sau đó WaitAll trên các đối tượng có thể báo hiệu đó.

Mỗi đối tượng có thể báo hiệu lần lượt sẽ được báo hiệu là thoát khỏi chuỗi. Khi tất cả chúng đều được báo hiệu, bạn biết tất cả các luồng đều đã chết và bạn đóng cửa sạch sẽ. Bạn phải đảm bảo rằng các điều kiện bất thường trong chủ đề của bạn không dẫn đến đối tượng có thể được kết nối của chuỗi đó không được đặt, hoặc WaitAll của bạn sẽ không bao giờ trở lại. Điều này có nghĩa là ngoại lệ thường - có thể sử dụng try...finally để đảm bảo các đối tượng được báo hiệu.

giả mới của bạn là

foreach (workitem in list of work) 
    start up thread associated with a ManualResetEvent or similar 

WaitAll for all events to be signalled 
cleanup 
Các vấn đề liên quan