2012-07-13 964 views
12

Tôi đã giả định rằng khi chấm dứt gỡ lỗi (chẳng hạn như bằng cách nhấn nút Dừng hoặc nhấn Shift + F5), bất kỳ lớp nào đang thực hiện trình kết thúc hoặc IDisposable sẽ được xử lý.Thực hiện mã khi trình gỡ rối VisualStudio thoát ra khỏi

Tôi có một số lớp triển khai IDisposable. Có một vài điều tôi muốn (thử) và làm như các ứng dụng thoát khỏi trình gỡ lỗi (hoặc từ bị rơi trong sản xuất). Ngay bây giờ, Dispose() dường như không được gọi, cũng không phải là finalizer ~MyClass(){}

Có cách nào để làm điều này không?

+0

Trừ khi xảy ra sự cố do ngoại lệ có thể bẫy, không có bất kỳ mã nào đang chạy sau sự cố. đó là bản chất của một sự cố ứng dụng. Đã xảy ra sự cố và bây giờ quá trình của bạn đã bị buộc phải chấm dứt. –

+1

@Boo Đã hiểu. Nhưng, nếu tôi có thể chạy mã theo ít nhất một tập con của các kịch bản, tôi sẽ lấy nó. – CoolUserName

+0

Nhấn nút dừng trong trình gỡ lỗi cũng giống như hệ điều hành chấm dứt ứng dụng của bạn.Nó bất ngờ và darn khá bất ngờ, không quan tâm đến bất cứ điều gì ứng dụng hiện tại có thể đang làm hoặc có ý định làm. –

Trả lời

2

Để dừng dịch vụ Windows thông thường, bạn nên đặt mã của mình vào phương pháp Dừng.

http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.stop.aspx

Nói chung, sợi thô lỗ hủy bỏ và thô lỗ unloads miền ứng dụng sẽ không chạy finalizers 'bình thường' - bạn có thể biết thêm chi tiết trong bài viết này MSDN.

https://web-beta.archive.org/web/20150423173148/https://msdn.microsoft.com/en-us/magazine/cc163716.aspx

Tính đến thời điểm này, tôi đã đơn giản nói về chủ đề hủy bỏ như là kết quả của thời gian chạy ném ThreadAbortException trên một sợi. Thông thường, điều này sẽ làm cho luồng kết thúc. Tuy nhiên, một luồng có thể xử lý một chuỗi bị hủy bỏ, ngăn không cho nó chấm dứt chuỗi. Để giải thích cho điều này, thời gian chạy cung cấp một hành động mạnh mẽ hơn, hủy bỏ chuỗi thô sơ được đặt tên khéo léo. Một sự hủy bỏ luồng thô lỗ làm cho một luồng ngừng hoạt động. Khi điều này xảy ra, CLR không đảm bảo rằng bất kỳ mã trả về nào trên luồng sẽ chạy (trừ khi mã đang thực thi trong CER). Rude, thực sự.

Tương tự như vậy, trong khi tải xuống miền ứng dụng điển hình sẽ hủy bỏ tất cả các chủ đề trong miền, tải xuống miền ứng dụng thô lỗ sẽ hủy bỏ tất cả các chủ đề trong miền và không đảm bảo rằng các trình kết thúc bình thường được liên kết với các đối tượng trong miền đó sẽ chạy . SQL Server 2005 là một máy chủ CLR sử dụng các hủy bỏ luồng thô lỗ và tải xuống miền ứng dụng thô lỗ như là một phần của chính sách leo thang của nó. Khi một ngoại lệ không đồng bộ xảy ra, lỗi phân bổ tài nguyên sẽ được nâng cấp thành hủy bỏ chuỗi. Và khi một hủy bỏ thread xảy ra, nếu nó không kết thúc trong một khoảng thời gian được thiết lập bởi SQL Server, nó sẽ được nâng cấp lên một chuỗi thô lỗ hủy bỏ. Tương tự như vậy, nếu một hoạt động unload miền ứng dụng không kết thúc trong một khoảng thời gian được thiết lập bởi SQL Server, nó sẽ được nâng cấp lên một miền ứng dụng thô lỗ. (Lưu ý rằng các chính sách chỉ được đặt ra không chính xác những gì SQL Server sử dụng, vì SQL Server cũng tính đến việc liệu mã có đang hoạt động ở các vùng quan trọng hay không, nhưng nhiều hơn về chủ đề đó ngay).

1

Vâng, CLR không thực hiện bất kỳ lời hứa nào về thời điểm đối tượng của bạn sắp được thu thập hoặc xử lý.

Bạn có thể thử gọi cho trình thu gom rác một cách rõ ràng, nhưng tôi không nghĩ đó là phương pháp được đề xuất.

Điều tốt nhất cần làm là sử dụng các đối tượng IDisposable bên trong khối using.
Đó là lần duy nhất khi bạn được đảm bảo khi chúng được xử lý.

+2

FWIW, 'sử dụng' chỉ là đường cú pháp để thử/cuối cùng, vì vậy nó không được bảo đảm hơn so với khối cuối cùng thông thường. –

+0

có, đó là cú pháp để thử/cuối cùng (Dispose()). xem ở đây- "Câu lệnh using đảm bảo rằng Dispose được gọi ngay cả khi một ngoại lệ xảy ra trong khi bạn đang gọi các phương thức trên đối tượng. Bạn có thể đạt được kết quả tương tự bằng cách đặt đối tượng bên trong khối thử và sau đó gọi Dispose trong khối cuối cùng". http://msdn.microsoft.com/en-us/library/yh598w02%28v=vs.100%29.aspx –