Sử dụng .Net 4.0. Tôi có một số mã mà cố gắng để mở một kết nối bằng cách sử dụng BeginConnect và một cuộc gọi lại. Nếu người dùng cố gắng dừng lập trình trong vài khoảnh khắc tiếp theo, tôi cố gắng ngắt kết nối. Tại thời điểm đó tôi thiết lập một lá cờ để cho biết liệu EndConnect có cần phải được gọi từ cuộc gọi lại hay không. Nếu cờ được đặt thành false, tôi bỏ qua EndConnect vì ổ cắm đã được chuyển vào thùng rác.Điều gì sẽ xảy ra nếu bạn không bao giờ gọi Socket.EndConnect?
Tại thời điểm này, người dùng có thể thử kết nối lại ngay lập tức. Tôi không thấy điều này xảy ra nhưng chỉ trong trường hợp. Bây giờ một socket mới được tạo và BeginConnect được gọi lại.
Bạn có bao giờ gọi phương thức EndConnect không?
@Richard. Cảm ơn vì sự trả lời. Tôi đã thử cách tiếp cận của bạn nhưng tôi tiếp tục nhận được ngoại lệ về AsyncResult không giống nhau từ cuộc gọi bắt đầu tương ứng. Tôi đi qua blog của một số anh chàng mà nói rằng chúng ta nên cache AsyncResult và kiểm tra xem nó là như nhau trước khi chúng tôi làm bất cứ điều gì. Điều này có vẻ dodgy và lá tôi trở lại tại điểm khởi đầu anyway. Chỉ cần bỏ qua những điều. – uriDium
@Richard. Được rồi wow. MSDN là rất mơ hồ rửa trên một vài điều. Đầu tiên nó nói: Bạn có thể tạo ra một phương thức gọi lại thực hiện ủy nhiệm AsyncCallback và chuyển tên của nó cho phương thức BeginConnect. Mà thực sự âm thanh như nó là tùy chọn. Sau đó, các đoạn tiếp theo nói: Phương thức gọi lại của bạn nên gọi phương thức EndConnect. Họ chỉ nói với tôi rằng nó là tùy chọn bây giờ họ đang nói với tôi rằng tôi nên gọi EndConnect. Tôi không thể gọi EndConnect nếu tôi "tùy ý" bỏ nó ra. Tuy nhiên: Phần này đã cho tôi hy vọng: Để hủy cuộc gọi đang chờ xử lý sang phương thức BeginConnect, hãy đóng Ổ cắm. – uriDium
@uriDium: Gọi lại là tùy chọn, nhưng gọi 'EndConnect' thì không. Thay vào đó bạn có thể đợi trên 'IAsyncResult' được trả về từ' BeginConnect' (hoặc thăm dò thuộc tính 'IsCompleted') và sau đó gọi' EndConnect' - tất cả mà không cần sử dụng gọi lại. Tóm tắt: 'EndConnect' phải được gọi, nhưng điều này không cần phải nằm trong ủy nhiệm được truyền cho' BeginConnect'. – Richard