System.Threading.ThreadAbortException: Thread wurde abgebrochen – welcher Thread?C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 System.Threading.ThreadAbortException: Thread wurde abgebrochen – welcher Thread?

Post by Anonymous »

Ich habe eine Website, die kontinuierlich Daten von einer anderen Website liest und diese Informationen auf einer Karte darstellt.
Ich habe einen Socket, der als

gestartet ist

Code: Select all

client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReceiveCallback), state);
ReceiveCallback liest die Daten und legt sie in einer Warteschlange ab, damit ein anderer Thread sie analysieren kann, und
setzt dann das Waithandle, um diesen Thread zu starten.

Code: Select all

readBytesWaitHandle.Set();
Sehr selten erhalte ich die folgende Fehlermeldung

Code: Select all

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
Die Frage ist: Welcher Thread wird abgebrochen? Derjenige, der „ReceiveCallback“ ausführt, oder derjenige, der auf „
“ wartet

Code: Select all

ReceiveCallback
, um das Wartehandle festzulegen.

Danke

Alan

Bearbeiten Hier ist der Code für ReceiveCallback

Code: Select all

// 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());
}
}
Sie werden sehen, dass ich versucht habe, alle Eventualitäten zu erfassen, die mir einfallen. Es schlägt häufig mit null gelesenen Bytes fehl und wird in Ordnung neu gestartet. (Ich überprüfe, ob der Neustartvorgang zu Beginn noch nicht läuft)

Der Catch-Block fängt diesen Fehler nicht ab.
Meine Website war gerade im Sterben (vielleicht alle 12 Stunden), also habe ich einen anderen Thread laufen lassen, der
den Zustand des Threads überprüft, der alle 30 Sekunden die Ausgabe von ReceiveCallback liest, und die obige Fehlermeldung ausgab.
Der Code dafür ist:

Code: Select all

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

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post