2009-06-28 61 views

Trả lời

23

Nói chung, không tạm dừng (hoặc hủy bỏ) một Thread - bạn có thể không thường nói những gì nó đang làm, và điều này có thể dẫn đến tất cả các loại các vấn đề về khóa, chẳng hạn như một khóa không được phát hành hoặc bộ khởi tạo kiểu (trình tạo tĩnh) bị treo.

Bạn có thể, tuy nhiên, tạm dừng mã thông qua các phương pháp thanh lịch hơn - ví dụ, sử dụng một ManualResetEvent trong vòng lặp của bạn rằng mã bên ngoài (trên thread khác) có thể mở và đóng cửa:

// worker loop 
while(alive) { 
    // if the gate is closed, wait up to 5 seconds; if still not 
    // open, go back to the loop-start to re-check "alive" 
    if (!gate.WaitOne(5000)) continue; 

    // do work... 
} 

Sau đó, một thread với truy cập (có thể gián tiếp) có thể tạm dừng (Reset) và tiếp tục (Set) công nhân, nhưng trong kiến ​​thức rằng nó chỉ tạm dừng ở trạng thái an toàn.


Viết bình luận của bạn (trên một trả lời khác) - có vẻ như bạn có người đọc và người viết; lý tưởng cho một kịch bản sản xuất/người tiêu dùng. Tôi có một ví dụ on this question về cách viết nhà sản xuất/người tiêu dùng với kích thước giới hạn (vì vậy nó sẽ không bị đầm lầy nếu người tiêu dùng chạy chậm) - khối người tiêu dùng nếu không có dữ liệu và nhà sản xuất chặn nếu có quá nhiều .

+1

+1 đó là cách tiếp cận hoàn toàn đúng. –

+1

Xin chào, đây là +1 thứ hai tôi phải cung cấp cho bạn hôm nay vì đã nêu một trong những câu thần chú của tôi: chủ đề phải chịu trách nhiệm về cuộc sống của chính họ, nếu không bạn sẽ gặp phải tất cả các vấn đề như deadlocks và dữ liệu bị mất. Sau này, không có súp nhiều hơn cho bạn ngày hôm nay :-) – paxdiablo

+0

Đó là tốt, tôi là giới hạn ngay bây giờ ;-p –

8

Nếu bạn đã hủy bỏ chuỗi, nó sẽ không thể chạy lại. Bạn có thể chạy cùng một tác vụ (ví dụ: cùng một số ThreadStart đại biểu) trên một chuỗi khác, nhưng không chạy lại cùng một dòng chủ đề.

Tôi sẽ mạnh mẽ khuyên bạn không nên gỡ khó chủ đề trừ khi ứng dụng của bạn sắp ngừng hoạt động. Thay vào đó, thay vào đó, hãy thực hiện giao thức graceful thread termination để bạn có thể cho biết tác vụ bạn muốn dừng. Điều tương tự cũng xảy ra với việc "tạm dừng" một chuỗi - bạn thực sự không muốn tạm dừng một luồng trong khi nó đang giữ một số tài nguyên quan trọng.

Có thể nếu bạn có thể cho chúng tôi biết thêm về trường hợp của bạn, chúng tôi có thể trợ giúp thêm. Chức năng tạm dừng/tiếp tục hoặc hủy tạm thời dễ dàng đạt được với monitors (xem phần thứ hai của trang) hoặc wait handles.

+4

Tôi xin đề xuất lệnh cấm đối với cả Jon Skeet và Marc Gravell ... bạn không được phép trả lời các câu hỏi phức tạp trong 30 phút đầu và câu hỏi đơn giản mãi mãi: P –

+0

đọc ứng dụng của tôi từ đầu đọc RFID cơ sở dữ liệu, tại văn bản dữ liệu trên tage đó tôi muốn hủy bỏ hoặc tạm dừng chủ đề đó và tiếp tục nó và làm thế nào để tạm dừng thread cụ thể plz giúp tôi trong khía cạnh đó –

1

Nếu bạn cần tạm dừng chuỗi trong một thời gian, hãy gọi cho chủ đề đó Sleep.

Nếu bạn cần tạm dừng cho đến khi một số điều kiện trở thành sự thật, hãy sử dụng biến điều kiện hoặc chờ đợi.

Đối với các biến điều kiện trong sử dụng .NET Monitor phương pháp bao gồm WaitPulse; see here để giới thiệu. (Windows Vista cũng đã thêm hỗ trợ Biến điều kiện gốc vào API Win32, nhưng đó là một triển khai hoàn toàn riêng biệt, .NET đã có hỗ trợ biến điều kiện từ phiên bản V1.0).

Đối Waits: đó là sử dụng kiến ​​của WaitAny hoặc WaitAny phương pháp quá tải của lớp WaitHandle chờ vào một trong các loại đối tượng đồng bộ hóa Win32 khác nhau tiếp xúc trong .NET là lớp con của WaitHandle (sự kiện, mutexes, timers waitable và vân vân).

0

Nếu bạn muốn làm điều đó mặc dù đó là một ý tưởng tồi, hãy xem các phương pháp Tạm dừng và Tiếp tục - MSDN có more info về chủ đề, bao gồm lý do tại sao đó là một ý tưởng tồi.

Để lặp lại - Tôi khuyên bạn nên sử dụng giải pháp của Marc Gravell thay thế.

+0

Chào newbie, đây là một khẩu súng và trong khi tôi ở đó bạn có thể có Một số viên đạn dumdum, hãy cẩn thận không bao giờ sử dụng thứ này thật sự nguy hiểm: P –

+0

Này, tôi là một fan hâm mộ lớn của "xã hội vũ trang" của Heinlein là một câu thần chú lịch sự, vì vậy, nếu sau tất cả những cảnh báo này, đi với Suspend/Resume ... ít nhất tôi đã trả lời câu hỏi của anh ấy :) –

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