2011-10-27 18 views
8

Tôi đã có lỗi thực sự, thực sự kỳ lạ mà tôi chưa bao giờ có thể ghim xuống (điều đó xảy ra rất hiếm khi). Về cơ bản, tôi có một ứng dụng C# ngẫu nhiên ném một ngoại lệ không xác định khi thoát. Tôi đã quản lý để nắm bắt nó trong trình gỡ lỗi thời gian này, và nó chỉ ra rằng gọi Application.Exit() là ném một System.InvalidOperationException với thông báo sau:System.InvalidOperationException do sửa đổi bộ sưu tập khi gọi đến Application.Exit()

Một ngoại lệ cơ hội đầu tiên của loại 'System.InvalidOperationException' xảy ra trong mscorlib. dll

Thông tin bổ sung: Bộ sưu tập đã được sửa đổi; hoạt động điều tra có thể không thực hiện được.

Tôi không chắc chắn những gì bộ sưu tập này đã bị cáo buộc sửa đổi hoặc ai đã sửa đổi bộ sưu tập đó.

Các vết đống không phải là rất hữu ích:

mscorlib.dll System.Collections.ArrayList.ArrayListEnumeratorSimple.MoveNext() + 0x13f byte System.Windows.Forms.dll System.Windows!. Forms.Application.ExitInternal() + 0x112 byte System.Windows.Forms.Application.Exit System.Windows.Forms.dll! (System.ComponentModel.CancelEventArgs e) + 0x65 byte

Bất kỳ ý tưởng làm thế nào tôi có thể tìm ra ArrayList nào mà nó đã được sửa đổi? Tôi không nghĩ rằng đó là bất cứ điều gì tôi đang làm một cách rõ ràng, nhiều khả năng một hành động tôi đang làm đó là sửa đổi trạng thái cơ bản của khung công tác .NET ở giữa một hoạt động mà MS không mong đợi ..

+0

Có vẻ như bộ sưu tập Biểu mẫu. IIRC Tôi đã thấy điều này xảy ra trước đây, nhưng không thể nhớ bất kỳ chi tiết nào, xin lỗi. – leppie

+1

Ứng dụng của bạn làm gì khi tắt máy? Bạn có thể vui lòng cung cấp mã không. – Fischermaen

+0

Không có gì, thực sự ... Vào thời điểm tôi nhấn nút thoát, ứng dụng ở trạng thái không hoạt động, không có chủ đề nền hoặc hoạt động nào đang chạy. –

Trả lời

17

Bất thường , chưa bao giờ thấy điều này trước đây. Phương thức Application.ExitInternal() lặp lại bộ sưu tập Application.OpenForms. Rõ ràng bộ sưu tập này đang được sửa đổi trong khi nó đang làm như vậy. Có rất ít nguyên nhân có thể cho điều này, tôi chỉ có thể tạo ra một nguyên nhân. Một trong các biểu mẫu của bạn đã ghi đè phương thức OnFormClosing() hoặc đã đăng ký sự kiện FormClosing. Và đang làm một cái gì đó mà sửa đổi bộ sưu tập OpenForms. Có thể xử lý đối tượng biểu mẫu hoặc tạo một cá thể biểu mẫu mới hoặc sửa đổi một thuộc tính biểu mẫu làm cho cửa sổ được tạo lại, như ShowInTaskbar.

Bạn sẽ không tìm thấy mã này trong ngăn xếp cuộc gọi. Xem lại mã On/FormClosing của bạn. Nhận xét mã ra nếu bạn không thể tìm thấy nó một cách nhanh chóng.

+0

Tôi có một mã FormClosing khá phức tạp mà đôi khi mở hộp tin nhắn. Ở mức nào, thay đổi từ Application.Exit() thành this.Close() dường như đã làm việc xung quanh các vấn đề mà không yêu cầu tôi thay đổi nội dung của FormClosing. –

+2

@Hans Passant, có cùng một vấn đề; và chắc chắn đủ, tôi đã hiển thị một hộp thông báo trong phương thức 'Form_CLOSING' của tôi. Và bùng nổ, sửa đổi bộ sưu tập tương tự. Thật ngớ ngẩn. Đã chuyển nó sang 'Form_CLOSED' và tốt. Kinda lẻ, nhưng hey, bravo trên kết quả đó. –

+1

Đây cũng chính là vấn đề của tôi, một MessageBox trong OnClosing đã làm mất hiệu lực ứng dụng. Di chuyển nó vào OnClosed cố định nó! – Blindy

0

Chúng tôi cũng đã dành cả ngày về vấn đề này ... nơi chúng tôi có ngoại lệ 'System.InvalidOperationException' và ứng dụng (trong trường hợp này sử dụng thư viện twain từ DynamSoft). Rõ ràng chúng ta không nên gọi CLOSE() sau khi gọi application.exit. Nhận xét ra các đóng làm ngoại lệ biến mất, và làm cho các ứng dụng kết thúc bình thường. Trực quan, ứng dụng sẽ hiển thị một hộp thông báo lạ từ Microsoft nói "bạn có muốn gửi thêm thông tin về vấn đề này không" - GÌ VẤN ĐỀ? nó không hiển thị bất cứ điều gì trước khi điều này, vì vậy chúng tôi đã đi đào qua dấu vết ngăn xếp.

   Utils.Logger.Info("", "AsystScanner/dynamicDotNetTwain2_OnPostAllTransfers"); 
       Utils.Logger.Info("Closing down application!", "AsystScanner/dynamicDotNetTwain2_OnPostAllTransfers"); 

       // caller should close down app, added 3/3/15 
       dynamicDotNetTwain2.CloseSource(); 
       dynamicDotNetTwain2.CloseSourceManager(); 

       System.Windows.Forms.Application.Exit(); 
no no! don't do a close here. 
       //try 
       //{ 
       // Close(); 
       //} 
       //catch (Exception ex) 
       //{ 
       // MessageBox.Show(ex.Message + " Routine=dynamicDotNetTwain2_OnPostAllTransfers/Close() statement failed. [EJS1503031630]"); 
       //} 
       return; 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message + " Routine=dynamicDotNetTwain2_OnPostAllTransfers [EJS1503031631]"); 
      }