Tôi đang học netcode và đa luồng trong Monodevelop, sử dụng C# với GTK #. Tôi chưa bao giờ làm trước đây, và bây giờ tôi thấy mình cần phải làm cả hai cùng một lúc.Ngoại lệ System.IO.IOException khi cố gắng kết thúc chủ đề
Tôi đã sử dụng chương trình trò chuyện hướng dẫn không xử lý lỗi và tôi đã gặp lỗi xảy ra trong ứng dụng khách mỗi lần tôi ngắt kết nối khỏi máy chủ. Mã nằm trong một chuỗi đang nghe tin nhắn như sau, được bao quanh bởi các câu lệnh try/catch:
try
{
while (Connected)
{
if (!srReceiver.EndOfStream && Connected)
{
string temp = srReceiver.ReadLine();
// Show the messages in the log TextBox
Gtk.Application.Invoke(delegate
{
UpdateLog(temp);
});
}
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Sau đó chức năng kết thúc và chỉ kết thúc.
Mã kết thúc kết nối trông như thế này, và chạy trên các chủ đề chính:
private void CloseConnection(string Reason)
{
// Show the reason why the connection is ending
UpdateLog(Reason);
// Enable and disable the appropriate controls on the form
txtIp.Sensitive = true;
txtUser.Sensitive = true;
txtMessage.Sensitive = false;
btnSend.Sensitive = false;
btnConnect.Label = "Connect";
// Close the objects
Connected = false;
swSender.Close();
srReceiver.Close();
tcpServer.Close();
}
Và try/catch câu nói trên bắt lỗi này:
System.IO.IOException: Unable to read data from the transport connection: A blocking operation was interrupted by a call to WSACancelBlockingCall. ---> System.Net.Sockets.SocketException: A blocking operation was interrupted by a call to WSACancelBlockingCall
at System.Net.Sockets.Socket.Receive(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
--- End of inner exception stack trace ---
at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)
at System.IO.StreamReader.ReadBuffer()
at System.IO.StreamReader.get_EndOfStream()
at ChatClientGTK.MainWindow.ReceiveMessages() in g:\Android\Tutes\ChatClientRemake\ChatClientGTK\MainWindow.cs:line 157
Bây giờ, như xa như tôi có thể nói, khi srReciever.Close() xảy ra trong chủ đề chính, srReciever.ReadLine() vẫn đang cố gắng thực hiện trong chuỗi nghe, đó là nơi mà vấn đề nằm, nhưng ngay cả khi tôi nhận xét ra srReciever.Close() , Tôi vẫn nhận được lỗi.
Theo như tôi có thể nói, không có tác dụng phụ gây ra bởi chỉ bắt lỗi và di chuyển, nhưng điều đó không thực sự phù hợp với tôi. Tôi có cần khắc phục lỗi này không và nếu có, có ai có ý tưởng gì không?
Một ví dụ khác về ngoại lệ được ném để cho biết điều kiện không ngoại lệ. Hầu hết mọi người xem xét rằng thiết kế API xấu, nhưng với .NET BCL nó phổ biến. –