System.Threading.ThreadAbortException: поток был прерван - какой поток?

1

У меня есть веб-сайт, который непрерывно считывает данные с другого сайта и отображает эту информацию на карте. У меня есть сокет, запущенный как

client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                    new AsyncCallback(ReceiveCallback), state);

ReceiveCallback считывает данные и отправляет их в очередь для анализа другого потока, а затем устанавливает waithandle для запуска этого потока.

readBytesWaitHandle.Set();

Очень редко я получаю следующую ошибку

System.Threading.ThreadAbortException: Thread was being aborted.
   at System.Threading.WaitHandle.WaitOneNative(SafeHandle waitableSafeHandle, UInt32      millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext)
   at System.Threading.WaitHandle.InternalWaitOne(SafeHandle waitableSafeHandle, Int64 millisecondsTimeout, Boolean hasThreadAffinity, Boolean exitContext)
   at System.Threading.WaitHandle.WaitOne(TimeSpan timeout, Boolean exitContext)
   at WebAPRS.PacketListener.readBytesBuffer() in c:\Users\Alan\Documents\Visual Studio 2013\Projects\WebAPRS\WebAPRS\PacketListener.cs:line 274

Вопрос в том, какой поток прерывается? Тот, на котором работает ReceiveCallback или тот, который ожидает ReceiveCallback для установки дескриптора ожидания.

благодаря

Алан

Изменить Вот код для ReceiveCallback

// run by the client thread (which is implicitly created)
    private void ReceiveCallback(IAsyncResult ar)
    {
        try
        {
            if (restarting) return;

            // Retrieve the state object and the client socket 
            // from the asynchronous state object.
            timeSpanSinceLastBytes = DateTime.Now - timeSinceLastBytes;
            timeSinceLastBytes = DateTime.Now;
            var state = (StateObject)ar.AsyncState;

            if (!state.workSocket.Connected)
            {
                reStartClient("Error: state.workSocket.Connected =false - Restarting");
                return;
            }

            var client = state.workSocket;

            // Read data from the remote device.
            var bytesRead = client.EndReceive(ar);

            if (bytesRead == 0)
            {
                reStartClient("ERROR: bytes==0 - Restarting");
                return;
            }

            // quickly store the buffer
            storeBytes buff = new storeBytes(state.buffer, bytesRead);
            byteQueue.Enqueue(buff);
            string data = Encoding.ASCII.GetString(state.buffer, 0, bytesRead);
            client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
            new AsyncCallback(ReceiveCallback), state);
            // setoff the readBytes Thread
            readBytesWaitHandle.Set();
        }
        catch(Exception e)
        {
            reStartClient("ReceiveCallback failed : " + e.ToString());
        }
    }

Вы увидите, что я пытался поймать каждую возможную ситуацию, о которой я могу думать. Он часто терпит неудачу с чтением нулевых байтов и перезапускается ОК. (Я проверяю, что процесс перезапуска не начинается в начале)

Блокировка не устраняет эту ошибку. Мой сайт просто умирал (возможно, раз в 12 часов), поэтому у меня есть еще один поток, который проверяет работоспособность потока, считывающего вывод из ReceiveCallback каждые 30 секунд, и он распечатывает сообщение об ошибке выше. Код для этого:

private void checkRunning(object state)
    {
        if(! ((packetListener.readBytes.ThreadState == ThreadState.Running)||(packetListener.readBytes.ThreadState == ThreadState.WaitSleepJoin)))
        {
            packetListener.appendToDebugFile("readBytes thread not running "+packetListener.readBytes.ThreadState.ToString());
        }
        if(! ((packetListener.readStrings.ThreadState == ThreadState.Running) || (packetListener.readStrings.ThreadState == ThreadState.WaitSleepJoin)))
        {
            packetListener.appendToDebugFile("readStrings thread not running " + packetListener.readStrings.ThreadState.ToString());
        }
        if (packetListener.timeSpanSinceLastBytes > TimeSpan.FromSeconds(30))
        {
            packetListener.appendToDebugFile("bytes not seen for " + packetListener.timeSpanSinceLastBytes.ToString());
        }
        packetListener.appendToDebugFile("Threads running OK");
    }
  • 4
    Вы делаете это неправильно, разместите код в вашем методе ReceiveCallback ().
  • 0
    это asp.net или winforms или wpf? Я предполагаю, что веб-приложение, если так, то, вероятно, прочитайте это тоже. Почему мое приложение asp.net выбрасывает ThreadAbortException
Показать ещё 2 комментария
Теги:
multithreading
sockets

1 ответ

0

Вы устали. Увеличьте ExecutionTimeout, как он работал для меня и других, используя AsyncCallback и получив эту самую ошибку, которую вы опубликовали.

<compilation debug="false"></compilation>
<httpRuntime executionTimeout="1800"/> //1800 seconds - 30 minutes. 

Вот прохождение для того, чтобы сделать вышеупомянутые изменения, и здесь есть аналогичная ситуация, когда ваша проблема решена.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню