2012-07-17 25 views
6

Một trong các lớp của tôi thu thập số liệu thống kê trong quá trình thực thi ứng dụng và tôi muốn lưu trữ số liệu thống kê này vào đĩa khi ứng dụng hoàn tất. Tôi không bao giờ phá hủy lớp này trong chương trình của tôi vì vậy tôi đã cố gắng để lưu trữ các bản ghi vào tập tin như thế:cách chính xác để lưu trữ thông tin vào tệp khi tắt ứng dụng

~Strategy() 
    { 
     foreach(var item in statisticItems) 
     { 
      log.WriteLine(item.Text); // log is AutoFlush 
     } 
    } 

Tuy nhiên tôi không thấy bản ghi tôi mong đợi để xem và tôi cũng không thể "bắt" trong thời điểm debugger khi destructor gọi là.

Câu hỏi:

  • Tại sao Trong debugger tôi không thể bắt khoảnh khắc khi destructor được gọi là? Không phải destructor phải được gọi cho mọi đối tượng khi chương trình kết thúc?
  • Tôi nên sử dụng thông tin gì để đăng nhập nội dung của mình?
+0

Bạn có tắt trình gỡ rối bằng nút dừng bằng bất kỳ cơ hội nào không? – Blindy

+0

@Blindy không, tôi chỉ đóng cửa sổ – javapowered

+0

Có phải 'Chiến lược 'đã được khởi tạo? Nó là một lớp tĩnh (hoặc bạn chỉ sử dụng các phương thức tĩnh của nó)? Cung cấp cho chúng tôi thêm thông tin, trường hợp sử dụng, bất cứ điều gì bạn có thể. Bạn có thể giảm giá một lỗi trong khuôn khổ cho vấn đề của bạn, nó là một cái gì đó trong mã của bạn, và chúng tôi chỉ có thể đoán tại thời điểm này. – Blindy

Trả lời

1

Trình hủy (hoặc finalizer) không phải là nơi để đặt mã như thế. Nó được thiết kế để phát hành các tài nguyên không được quản lý. Destructors được gọi là non-deterministically, vì vậy bạn không thể dựa vào bất kỳ đối tượng nào của bạn đang hợp lệ bên trong destructor. Và bạn không thể bắt được nó trong trình gỡ rối vì nó được gọi trên một luồng riêng biệt, trong các trường hợp rất đặc biệt. Trong ngắn hạn, không sử dụng destructors, trừ khi bạn biết bạn cần.

Cách lý tưởng để đăng nhập tắt ứng dụng là chỉ cần đặt mã đăng nhập vào cuối phương thức Main. Bạn nên chắc chắn rằng bạn bắt và đăng nhập bất kỳ trường hợp ngoại lệ được ném, và nếu đó là trường hợp, bạn có thể đăng nhập tắt máy ở cuối Main.

Sẽ có một vài trường hợp cạnh mà bạn sẽ không thể đăng nhập tắt máy, vì các lỗi như tràn ngăn xếp.Trong những trường hợp đó, bạn sẽ cần phải dựa vào nhật ký về những gì đã xảy ra trước khi xảy ra lỗi.

+0

Trong khi lời khuyên tốt, không ai trong số này trả lời câu hỏi thực tế của mình ... – Blindy

+0

Nó trả lời câu hỏi "Tôi nên sử dụng gì để đăng nhập nội dung của mình?" –

+0

Bây giờ, nó cũng giải quyết các câu hỏi khác. –

-1

Không dựa vào destructors. Tôi khuyên bạn nên sử dụng một cái gì đó như thế này:

[STAThread] 
static void Main() 
{ 
    using(new Strategy()) 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 
} 

public class Strategy : IDisposable 
{ 
    public void Dispose() 
    { 
     WriteLogs() 
    } 
    ... 
} 

Bằng cách này bạn chắc chắn rằng nhật ký của mình sẽ được viết.

Khoảng trống tĩnh Chính được sao chép từ chương trình mặc định.cs được tạo khi tạo ứng dụng biểu mẫu cửa sổ.

+0

-1 để quảng bá mẫu dùng một lần sai. Bạn không nên lộn xộn với cái này, sử dụng thỏa thuận thực sự. – Blindy

+0

Tại sao bạn sử dụng thuộc tính 'STAThread' thuộc về COM afaik? tại sao tôi không nên dựa vào destructor? – javapowered

+0

'Disposable' là một tối ưu hóa trên các destructors (và mẫu thích hợp bao gồm một destructor anyway), lợi ích chính của nó là nó cho phép bạn giải phóng tài nguyên theo yêu cầu. – Blindy

-1

Đây là không phải là một câu trả lời hoàn chỉnh (chưa), nhưng kiểm tra này ra:

Lập trình viên không kiểm soát khi destructor được gọi vì đây được xác định bởi các bộ thu rác. Thùng rác kiểm tra bộ sưu tập đối với các đối tượng không còn được sử dụng bởi ứng dụng . Nếu nó xem xét một đối tượng đủ điều kiện để hủy, nó gọi destructor (nếu có) và reclaims bộ nhớ được sử dụng để lưu trữ đối tượng. Destructors cũng được gọi khi chương trình thoát.

Nguồn: MSDN

Nếu đó là một ứng dụng giao diện điều khiển, bạn có thể thử gọi Environment.Exit(0); để xem những gì sẽ xảy ra?

Hãy tiếp tục cập nhật câu trả lời này vì đây là một câu hỏi thú vị. Bất cứ ai cũng cảm thấy tự do để chỉnh sửa.

Kính trọng

+0

Nếu bạn muốn có một câu trả lời theo kiểu wiki, câu trả lời của cộng đồng wiki là cách để đi. –

+0

@KendallFrey nếu bạn không muốn chỉnh sửa, bạn không cần phải chỉnh sửa. Tuy nhiên, tôi đã đặt câu hỏi cho OP và tôi đang chờ phản hồi để cải thiện câu trả lời của mình. Tốt hơn là chỉ nói "bạn sai, nên làm theo cách này" –

+0

Nhận xét là nơi đặt câu hỏi của OP. Câu trả lời là câu trả lời. –

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