2010-02-08 23 views
5

Tôi có một chương trình mà tôi chạy và ở giữa tôi nhận được tin nhắn này:nhắn Strange về chủ đề trong C#

Managed Debugging Assistant 'ContextSwitchDeadlock' đã phát hiện ra một vấn đề trong 'C: \ Documents and Settings \ Lena G \ My Documents \ SchoolStuff \ IR Thông tin \ Trang chủ \ FianlProject \ finalProject \ finalProject \ bin \ Debug \ finalProject.vshost.exe '. Thông tin bổ sung: CLR không thể chuyển đổi từ ngữ cảnh COM 0x3407968 sang ngữ cảnh COM 0x3407ad8 trong 60 giây. Chủ đề sở hữu bối cảnh/căn hộ đích có nhiều khả năng thực hiện việc chờ đợi không bơm 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 Windows. Tình trạng này thường có tác động tiêu cực về hiệu suất và thậm chí có thể dẫn đến việc ứng dụng trở nên không đáp ứng hoặc sử dụng bộ nhớ tích lũy liên tục theo thời gian. Để tránh vấn đề này, tất cả các chủ đề căn hộ đơn luồng (STA) nên sử dụng bơm nguyên thủy chờ đợi (như CoWaitForMultipleHandles) và thường xuyên bơm các thông điệp trong các hoạt động chạy dài.

Tôi hiểu rằng nó có liên quan đến thực tế là nó chạy trong 60 giây mà không dừng lại hoặc một cái gì đó như thế? Làm thế nào nó là một vấn đề? Tôi cũng đặt [STAThread] trước phần chính của chương trình bởi vì nếu tôi xóa nó thì nó sẽ hiển thị cho tôi thông báo này:

Một ngoại lệ không được loại trừ 'System.Threading.ThreadStateException' xảy ra trong System.Windows.Forms.dll Thông tin bổ sung: Chủ đề hiện tại phải được đặt thành chế độ căn hộ đơn lẻ (STA) trước khi có thể thực hiện các cuộc gọi OLE. Đảm bảo rằng chức năng chính của bạn có STAThreadAttribute được đánh dấu trên đó. Ngoại lệ này chỉ được nâng lên nếu trình gỡ lỗi được đính kèm vào quy trình.

Bất kỳ ai biết cách tôi có thể giải quyết vấn đề này?

Cảm ơn trước,

Lena

Trả lời

1

Đó là cảnh báo được tạo khi bạn thực hiện cuộc gọi trên đối tượng ActiveX từ chuỗi nền và chuỗi chính của bạn bị chặn. Có lẽ nhiều khả năng: đã có một lỗi trong phiên bản bán lẻ của Visual Studio 2005 đã vấp phải cảnh báo này vì không có lý do chính đáng. Nó đã được sửa trong Service Pack 1, hãy chắc chắn rằng bạn đã cài đặt nó. Tuy nhiên, cách giải quyết khác là tắt nó đi. Gỡ lỗi + Ngoại lệ, Trợ lý gỡ lỗi được quản lý, bỏ qua cảnh báo ContextSwitchDeadlock. Nhưng sử dụng SP1 nếu bạn không có nó.

+0

Nếu tôi tắt công tắc bối cảnh, có thể gây hại gì không? Tôi đang sử dụng Visual Studio 2008 .. –

+0

Sẽ không có gì xảy ra. Bạn thực sự có thể có một bế tắc. Bạn sẽ tìm ra đủ nhanh, chương trình của bạn sẽ đóng băng. –

2

Bạn cần phải chắc chắn rằng chủ đề của bạn sở hữu các thành phần COM không được "nhốt" qua chế biến> 60 giây.

Điều có thể xảy ra là bạn có đối tượng COM trong biểu mẫu và bạn đang thực hiện công việc trên chuỗi giao diện người dùng. Nếu giao diện người dùng của bạn bị chặn bởi quá trình xử lý> 60 giây, thành phần COM có thể khiếu nại.

Cân nhắc sử dụng trường hợp BackgroundWorker để xử lý quy trình chạy dài của bạn. Điều này sẽ đẩy công việc lên một chủ đề nền và cho phép thành phần COM xử lý các thông báo mà không có khiếu nại.

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