2009-06-23 7 views
15

Điều gì xảy ra với một chuỗi nếu nó đang chạy một phương thức trong một đối tượng được giải thoát bằng cách thoát khỏi khối sử dụng?
Ví dụ:C# thoát một khối bằng cách sử dụng() với một chủ đề vẫn đang chạy onthe đối tượng vi phạm

 
    using (SomeObject obj = new SomeObject()) 
    { 
     obj.param = 10 ; 
     Thread newThread = new Thread(() => { obj.Work(); }); 
     newThread.Start(); 
    } 
    ... 

obj.Work() đang chạy trên một chủ đề mới nhưng obj là một đối tượng IDisposable mà thông thường sẽ được phát hành khi sử dụng lối ra khối. Điều gì xảy ra nếu chuỗi tiếp tục chạy sau khi khối sử dụng kết thúc? Liệu đối tượng sẽ được xử lý chỉ sau khi luồng hoàn thành? Hoặc sẽ phá vỡ thread?

Cảm ơn.

+0

Thay vì sử dụng câu lệnh bên ngoài chuỗi, hãy đặt nó bên trong chuỗi. Chủ đề newthread = new Thread (() => { sử dụng (SomeObject obj = new SomeObject()) { obj.param = 10; obj.Work();} }); newThread.Start(); – Relster

Trả lời

4

Hãy nhớ rằng IDisposable chỉ là một mẫu và không giải phóng bộ nhớ được liên kết với đối tượng. Đây là trường hợp đóng của khối using sẽ gọi obj.Dispose và luồng khác đang sử dụng obj sẽ tiếp tục chạy.

Điều này sẽ tạo ra các sự cố lạ đối với bạn vì trạng thái obj's có thể thay đổi trong khi chủ đề khác đang sử dụng nó (tất cả phụ thuộc vào phương pháp Dispose được triển khai). Không cần phải nói ứng dụng này là IDisposable, luồng và tuyên bố using sẽ có vấn đề ở mức tốt nhất.

1

Khi khối sử dụng được thoát trên chuỗi chính, nó sẽ .Đặt() đối tượng, có thể gây ra tất cả các loại vấn đề tương tranh thú vị. Tuy nhiên, đối tượng sẽ không được thu thập rác - nó sẽ vẫn còn, nhưng ở trạng thái không hợp lệ, tùy thuộc vào việc bạn thực hiện .Dispose().

11

Điều thú vị sẽ xảy ra.

Cụ thể, phương pháp xử lý trên SomeObject sẽ được gọi, trước hoặc sau khi Công việc được gọi là có thể hoặc có thể chưa được lên lịch để chạy trước thời điểm đó.

Sau đó, nó phụ thuộc vào phương pháp xử lý của SomeObject; nếu nó, nói, phát hành một SqlConnection mà không được sử dụng trong 'làm việc', sau đó không nên có một vấn đề; tuy nhiên, nếu SomeObject hy vọng rằng nó chưa được xử lý, có thể bạn sẽ có một ngoại lệ được ném vào chuỗi đó.

+0

Những điều thú vị, tốt nhất. – Groo

+0

Vì lý do nào đó, nó khiến tôi nghĩ về Mos Def trong công việc Ý: "Tôi đã có một trải nghiệm tồi tệ". –

2

Đối tượng sẽ gọi Vứt bỏ ở cuối khối. Nó sẽ tiếp tục chạy, nhưng obj sẽ trở nên không ổn định vì Dispose được giả sử đóng các kết nối ... Bây giờ có thể là obj sẽ được thiết lập để kiểm tra xem có cái gì đang được sử dụng và đóng nó sau đó, nhưng tôi sẽ không tính vào điều này trừ khi bạn đã viết đối tượng để xử lý điều này.