2011-11-12 39 views
17

tôi có một lớp trong C# (.net 3.5 cp, vs2010) thực hiện các sự phức tạp phức tạp mà thường mất nhiều thời gian. Sau một phút có một ngoại lệ, ContextSwitchDeadlock đã được phát hiện. Ngoại lệ được bản địa hóa, thành ngôn ngữ không phải tiếng Anh của tôi nên tôi không thể sao chép được, nhưng ý nghĩa như sau: ¨ Mô-đun CLR không thể chuyển từ ngữ cảnh COM ... sang ngữ cảnh COM ... trong 60 giây. Các tiểu dự án sở hữu bối cảnh/căn hộ mục tiêu có thể đang chờ đợi hoặc xử lý một hoạt động chạy rất dài mà không cần bơm thông điệp hệ thống Windows..NET - ContextSwitchDeadlock đã được phát hiện

Về cơ bản, có vẻ như ứng dụng của tôi đang tính toán và không phản hồi cửa sổ trong một thời gian dài và studio trực quan tắt nó và báo cáo bế tắc có thể xảy ra.

Tôi đã cố gắng để làm một số nghiên cứu và phát hiện hai giải pháp:

  1. Tắt một số tùy chọn trong debbuger visual studio để phát hiện sự bế tắc. Dost không làm việc cho tôi bởi vì nó chỉ cho phép gỡ lỗi.

  2. Gọi một số phương thức DoEvents, nhưng nó dành cho biểu mẫu cửa sổ chứ không phải WPF và tôi đang sử dụng WPF.

Ngoài ra còn có đề xuất tạo chuỗi riêng biệt, nhưng tôi hoàn toàn mới cho luồng và không biết tôi nên làm gì. Bất kỳ đề nghị xin vui lòng?

Trả lời

39

Đây chỉ là cảnh báo từ Trợ lý gỡ lỗi được quản lý (MDA). Mã của bạn vi phạm một yêu cầu khá khó đối với các chủ đề Single Threaded Apartment (STA), chúng không được phép chặn trong thời gian dài. Cảnh báo là đủ thực, việc chặn luồng giao diện người dùng có thể dễ dàng gây ra bế tắc. Nhưng lời giải thích trong trường hợp của bạn là đơn giản, nó chỉ đi catatonic vì nó là máy tính bận rộn, không phải vì nó thực sự bị chặn. MDA không thể nói sự khác biệt.

Bạn có thể tắt cảnh báo bằng Debug + Exceptions, mở nút Managed Debugging Assistants và bỏ ContextSwitchDeadlock.

Điều đó vẫn khiến người dùng có cửa sổ trên máy tính để bàn của cô đã chết trên thế giới, không chính xác là trải nghiệm người dùng tuyệt vời. Và nó có thể có tác dụng phụ, khiến các chương trình khác trở nên không phản hồi khi họ gửi tin nhắn tới cửa sổ to lớn.

Bạn cần sử dụng luồng để thực sự giải quyết vấn đề này. Có một cái nhìn tại BackgroundWorker, nó cũng là tài liệu trong thư viện MSDN và nhiều nơi khác.

+0

Cảm ơn bạn, tôi sẽ cố gắng làm việc nền. –

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