Chào buổi sáng! Giả sử chúng ta có lớp sau:Triển khai IDisposable cho lớp chứa chủ đề
class MultithreadOperation : IDisposable
{
private IList<Thread> operationThreads;
public void StartOperation()
{
// Initialize and start threads and put them to operationThreads
}
public void StopOperation()
{
// Aborts each thread.
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (!disposed)
{
disposed = true;
if (disposing)
{
// Release managed resources.
#1:
StopOperation();
}
// Release unmanaged resources.
#2:
StopOperation();
}
}
~MultithreadOperation()
{
Dispose(false);
}
}
Thực ra, tôi cần dừng tất cả các chủ đề nếu cá thể được xử lý. Ngoài ra, tôi cần phải dừng tất cả các chủ đề nếu dụ là rác thu thập được (nếu không, các chủ đề sẽ vẫn còn sống, đó là xấu cho tôi). Chắc chắn, hoàn toàn hợp pháp khi gọi phương thức StopOperation() ở vị trí # 1.
Tôi muốn biết có bất kỳ cạm bẫy nào nếu chúng ta gọi StopOperation() ở vị trí số 2 không? Như tôi đã hiểu, danh sách các luồng có thể đã được thu thập rác khi ~ MultithreadOperation() đang thực hiện. Ngoài ra, tôi đã nhìn thấy rất nhiều khuyến nghị để tránh bất kỳ mã nào đề cập đến các tài nguyên được quản lý trong quá trình thực hiện Hoàn tất, đặc biệt là các trường mẫu.
Ngoài ra, sẽ rất thú vị khi nghe về các cách tiếp cận khác nhau cho vấn đề này. Cảm ơn!
có thể trùng lặp của mẫu [C# Finalize/Dispose pattern] (http://stackoverflow.com/questions/898828/c-finalize-dispose-pattern) – x0n
bỏ phiếu để đóng. điều này đã được yêu cầu và trả lời hàng triệu lần trên web. thay thế "chuỗi" bằng "đối tượng được quản lý" và câu hỏi là trùng lặp. – x0n
Làm thế nào về chủ đề sẽ vẫn còn sống sau khi MutilthreadOperation là rác thu thập? Hành vi này khá tệ. Chủ đề Bạn đã gợi ý không dừng thread trong finalizer. – Alexander