Ich habe einen Socket, der als
gestartet ist
Code: Select all
client.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0,
new AsyncCallback(ReceiveCallback), state);
setzt dann das Waithandle, um diesen Thread zu starten.
Code: Select all
readBytesWaitHandle.Set();
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
“ wartet
Code: Select all
ReceiveCallbackDanke
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());
}
}
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");
}
Mobile version