2010-01-09 38 views
7

Tôi đang tạo ứng dụng máy chủ/ứng dụng khách.C# không thể truy cập đối tượng được xử lý

Tôi đặt socket máy chủ để nghe và đặt phương thức BeginAccept(). Và khi tôi đóng socket máy chủ (Socket.Close()) để tắt máy chủ, một ngoại lệ được gửi từ phương thức gọi lại không đồng bộ của phương thức BeginAccept(). tôi kiểm tra ngoại lệ, và tôi thấy ngoại trừ nói với tôi điều này:

Message "Không thể truy cập một đối tượng xử lý tên 'System.Net.Sockets.Socket' tên Object:. 'System.Net.Sockets.Socket' . " Theo quan điểm của tôi, đây chỉ là điều này: "Ổ cắm được xử lý khi tôi gọi phương thức Socket.Close(), nhưng cuộc gọi lại không được phát hành trước khi chốt đóng."

tôi đã tìm kiếm trên mạng và thấy đây không phải là lỗi nhưng ngoại lệ được thiết kế là beginaccept đã bị hủy.

câu hỏi của tôi làm cách nào để xử lý excepton này? những gì chế biến có cần phải được cho nó?

Tôi chỉ sẽ đối xử với nó như một sự kiện bình thường:

 OnNetworkEvents eventArgs = new OnNetworkEvents(false, "Ready", e.Message); 
     OnUpdateNetworkStatusMessage(this, eventArgs); 

bất kỳ ý kiến ​​vẫn được chào đón.

+0

ok nhìn qua mã và có tôi có thể chắc chắn bằng cách xử lý nó như một tin nhắn thân thiện không tiếp xúc với ứng dụng thất bại. cảm ơn. – iTEgg

+0

Có thể trả lời câu hỏi của bạn liên quan đến TcpListener hoặc Sockets? –

Trả lời

6

Nếu bạn không quan tâm đến ngoại lệ (nghĩa là nó không phải là "ngoại lệ", đó là quy trình hoạt động bình thường và xảy ra mọi lúc), bạn chỉ có thể bỏ qua/tắt nó. (Chỉ cần miễn là nó sẽ không xảy ra trong một tình huống mà chỉ ra một lỗi thực sự)

Nếu bạn muốn ngăn chặn nó gọn gàng hơn, bạn có thể đặt một lá cờ cho bạn biết rằng nó sẽ tắt và có gọi lại thực sự làm việc đóng/xử lý ổ cắm. Bằng cách đó bạn có thể đảm bảo rằng không có đọc đang chờ trên socket và sẽ không nhận được ngoại lệ (nhưng điều này có nghĩa là nó sẽ treo về vô thời hạn, cho đến khi một gói khác được nhận - điều này tất nhiên có thể không bao giờ xảy ra).

Nếu bạn kiểm soát cả hai đầu của liên kết truyền thông, bạn có thể gửi thông báo "tắt" rõ ràng cho khách hàng biết rằng kết nối sẽ bị đóng (và điều này tất nhiên có thể được áp dụng khi gọi lại khi nhận được tin nhắn).

(Nhưng tôi rất muốn nghe nếu bất cứ ai khác đã tìm thấy một giải pháp tốt hơn là tôi có một tình huống tương tự với một vệ tinh viễn thông thực hiện UDP)

+0

(Chỉ cần miễn là nó sẽ không xảy ra trong một tình huống mà chỉ ra một lỗi thực sự) -> có tôi không thể chắc chắn về điều này. Tôi cũng quan tâm đến việc biết thêm về ý kiến ​​của người khác. có im viết cả máy khách và máy chủ trong trường hợp này. im luôn cho mã gọn gàng thay vì mã chỉ hoạt động. – iTEgg

1

Here is a fair solution. Tuy nhiên, tôi đã mong đợi khung công tác hỗ trợ cho điều này - tức là sau khi đóng máy khách, cuộc gọi lại không được gọi nữa.

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