Я пишу бота для модерации моего канала twitch.tv на С#.
Вот базовый код для цикла, который выполняется фоновым рабочим, чтобы избежать зависаний пользовательского интерфейса. Есть TCPClient (клиент), StreamReader (читатель), StreamWriter (писатель) и NetworkStream (поток).
private void listener_dowork(object sender, DoWorkEventArgs e)
{
string Data = "";
while ((Data = Reader.ReadLine()) != null)
{
//Perform operations on the received data
}
Console.WriteLine("Loop ended");//this shouldn't happen
}
private void listener_workercompleted(object sender, RunWorkerCompletedEventArgs e)
{
//basically, display a console message that says "OOPS!" and try to reconnect.
}
Я получаю сообщение "Цикл завершен" и "Упс!" и в этот момент я получаю исключение (которое я не могу поймать на всю жизнь).
Дело в том, что я могу физически отключить сетевой кабель от своего компьютера, подождать 30 секунд и снова подключить его, и все будет нормально.
Полное исключение:
System.Net.Sockets.SocketException (0x80004005): An established connection was aborted by the software in your host machine
at System.Net.Sockets.Socket.Send(Byte[] buffer, Int32 offset, Int32 size, SocketFlags socketFlags)
at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
Обратите внимание на отсутствие номера строки, который присутствует во всех других типах исключений, которые у меня были, что означает, что я понятия не имею, какая часть программы вызывает исключение, хотя я поместил каждую возможную строку в попытку /поймать.
Я думаю, что я ищу, это некоторое понимание того, почему это происходит.
Это происходит неизменно каждый раз, когда я запускаю бота и оставляю его работать на несколько минут на любом канале, хотя количество минут варьируется.