2011-08-29 32 views
6

Ứng dụng của tôi đang hoạt động như ứng dụng khách cho máy chủ Ngân hàng. Ứng dụng đang gửi yêu cầu và nhận phản hồi từ ngân hàng. Ứng dụng này thường làm việc tốt, nhưng đôi khiThao tác I/O đã bị hủy bỏ vì thoát khỏi luồng hoặc yêu cầu ứng dụng

Các I/O hoạt động đã được hủy bỏ vì hoặc là một lối ra chủ đề hoặc một ứng dụng yêu cầu

lỗi với mã lỗi như 995 đang đến.

public void OnDataReceived(IAsyncResult asyn) 
{ 
    BLCommonFunctions.WriteLogger(0, "In :- OnDataReceived", 
             ref swReceivedLogWriter, strLogPath, 0); 
    try 
    { 
     SocketPacket theSockId = (SocketPacket)asyn.AsyncState; 

     int iRx = theSockId.thisSocket.EndReceive(asyn); //Here error is coming 
     string strHEX = BLCommonFunctions.ByteArrToHex(theSockId.dataBuffer);      

    } 
} 

Khi lỗi này bắt đầu đến cho tất cả các giao dịch sau đó báo lỗi tương tự bắt đầu xuất hiện, vì vậy hãy giúp tôi để sắp xếp ra vấn đề này. Nếu có thể sau đó với một số mẫu mã

Kính trọng, Ashish Khandelwal

+0

Có vài lỗi Windows có tính mô tả và đáng tin cậy như vậy. Chúng tôi không thể giúp bạn tìm chuỗi đang kết thúc quá sớm. Thêm một số truy tìm vào mã của bạn nếu bạn không thể tìm thấy nó. –

Trả lời

9

995 là một lỗi báo cáo của IO Completion Port. Lỗi đến từ khi bạn cố gắng tiếp tục đọc từ ổ cắm khi nó có nhiều khả năng bị đóng.

Nhận 0 byte từ EndRecieve có nghĩa là ổ cắm đã bị đóng, cũng như hầu hết các ngoại lệ mà EndRecieve sẽ ném.

Bạn cần bắt đầu xử lý các tình huống đó.

Không bao giờ bỏ qua ngoại lệ, chúng được ném vì một lý do.

Cập nhật

Không có gì mà nói rằng các máy chủ thực hiện bất cứ điều gì sai. Một kết nối có thể bị mất vì nhiều lý do vì kết nối không hoạt động bị đóng bởi switch/router/firewall, vv .. Lỗi mạng cũng xảy ra.

Điều tôi đang nói là bạn PHẢI xử lý các ngắt kết nối. Cách thích hợp để làm như vậy là vứt bỏ ổ cắm và cố gắng kết nối một ổ cắm mới trong một khoảng thời gian nhất định.

Đối với nhận gọi lại một cách đúng đắn hơn về xử lý nó là một cái gì đó như thế này (mã giả bán):

public void OnDataReceived(IAsyncResult asyn) 
{ 
    BLCommonFunctions.WriteLogger(0, "In :- OnDataReceived", ref swReceivedLogWriter, strLogPath, 0); 

    try 
    { 
     SocketPacket client = (SocketPacket)asyn.AsyncState; 

     int bytesReceived = client.thisSocket.EndReceive(asyn); //Here error is coming 
     if (bytesReceived == 0) 
     { 
      HandleDisconnect(client); 
      return; 
     } 
    } 
    catch (Exception err) 
    { 
     HandleDisconnect(client); 
    } 

    try 
    { 
     string strHEX = BLCommonFunctions.ByteArrToHex(theSockId.dataBuffer);      

     //do your handling here 
    } 
    catch (Exception err) 
    { 
     // Your logic threw an exception. handle it accordinhly 
    } 

    try 
    { 
     client.thisSocket.BeginRecieve(.. all parameters ..); 
    } 
    catch (Exception err) 
    { 
     HandleDisconnect(client); 
    } 
} 

lý do tại sao tôi đang sử dụng ba khối catch đơn giản là bởi vì logic cho cái ở giữa khác với hai cái còn lại. Ngoại lệ từ BeginReceive/EndReceive thường cho biết ngắt kết nối ổ cắm trong khi các ngoại lệ từ logic của bạn không nên dừng việc tiếp nhận socket.

+1

Kính gửi jgauffin, Cảm ơn phản hồi của bạn, nhưng vấn đề là chỉ ứng dụng của khách hàng là từ công ty và máy chủ của chúng tôi là từ một số ngân hàng, vì vậy nếu socket đóng cửa từ phía họ thì làm thế nào để thể hiện họ rằng vấn đề này là từ phía họ xử lý điều này mà không có ngoại lệ tức là vì nó ném ngoại lệ trong endreceive chúng ta có thể viết bất kỳ lệnh nào sẽ cho chúng ta biết rằng việc nhận dữ liệu là 0 – funsukvangdu

+1

đọc bản cập nhật của tôi. – jgauffin

+0

@funsukvangdu: Bạn còn câu hỏi nào nữa không? – jgauffin

4

Tôi gặp vấn đề tương tự với giao tiếp RS232. Lý do, là chương trình của bạn thực hiện nhanh hơn nhiều so với comport (hoặc truyền thông nối tiếp chậm).

Để khắc phục, tôi phải kiểm tra xem IAsyncResult.IsCompleted==true. Nếu không hoàn thành, sau đó IAsyncResult.AsyncWaitHandle.WaitOne()

Như thế này:

Stream s = this.GetStream(); 
IAsyncResult ar = s.BeginWrite(data, 0, data.Length, SendAsync, state); 
if (!ar.IsCompleted) 
    ar.AsyncWaitHandle.WaitOne(); 

Hầu hết thời gian, ar.IsCompleted sẽ true.

+0

điều này đang hoạt động như một phép thuật! Cảm ơn –

0

gì tôi làm khi nó xảy ra là Disable cổng COM vào Manager DeviceEnable nó một lần nữa.

Nó dừng giao tiếp với một chương trình hoặc chuỗi khác và trở nên miễn phí cho bạn.

Tôi hy vọng điều này phù hợp với bạn. Trân trọng.

0

Tôi gặp sự cố này. Tôi nghĩ rằng nó đã được gây ra bởi các ổ cắm được mở ra và không có dữ liệu đến trong vòng một thời gian ngắn sau khi mở. Tôi đang đọc từ một hộp nối tiếp đến hộp ethernet được gọi là Devicemaster. Tôi đã thay đổi cài đặt cổng Devicemaster từ "kết nối luôn" thành "kết nối trên dữ liệu" và sự cố đã biến mất. Tôi rất tôn trọng Hans Passant nhưng tôi không đồng ý rằng đây là một mã lỗi mà bạn có thể dễ dàng giải quyết bằng cách kiểm tra mã.

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