簡體   English   中英

System.Threading.ThreadAbortException:線程正在中止-哪個線程?

[英]System.Threading.ThreadAbortException: Thread was being aborted - which Thread?

我有一個網站,該網站不斷從另一個站點讀取數據並將其繪制在地圖上。 我有一個插座啟動為

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

您正在超時。 增加ExecutionTimeout,因為它對我和其他使用AsyncCallback並且收到您發布的錯誤消息。

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

這是進行上述更改的分步指南,這與您要解決的情況類似

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM