【问题标题】:System.Threading.ThreadAbortException: Thread was being aborted - which Thread?System.Threading.ThreadAbortException:线程被中止 - 哪个线程?
【发布时间】:2014-10-17 04:03:08
【问题描述】:

我有一个网站,它不断地从另一个网站读取数据并将该信息绘制在地图上。 我有一个以

开头的套接字
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
                    new AsyncCallback(ReceiveCallback), state);

ReceiveCallback 读取数据并将其转储到队列中以供另一个线程分析,然后 设置等待句柄以启动该线程。

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());
        }
    }

你会看到我已经尽力捕捉到我能想到的每一种可能性。它经常以零字节读取失败并重新启动正常。 (我检查一下重启过程一开始没有进行)

catch 块没有捕捉到这个错误。 我的网站快要死了(可能每 12 小时一次),所以我运行了另一个线程来检查 每 30 秒从 ReceiveCallback 读取输出的线程的运行状况,并打印出上面的错误消息。 代码是:

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");
    }

【问题讨论】:

  • 你做错了,把代码贴在你的 ReceiveCallback() 方法中。
  • 是 asp.net 还是 winforms 还是 wpf?我假设一个 Web 应用程序,如果是这样,那么可能也会读到这个 ​​Why is my asp.net application throwing ThreadAbortException
  • 感谢您的回答。这是 ReceiveCallback 的代码
  • 我根本不使用 Response.Redirect。它是一个网络应用程序。谢谢

标签: c# multithreading sockets


【解决方案1】:

您将超时。增加 ExecutionTimeout,因为它适用于我和其他使用 AsyncCallback 的人并收到您发布的这个错误。

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

这里是where to make the above changes 的演练,这里是similar situation to yours getting resolved。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-30
    • 2012-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多