我有一个网站,它不断从另一个网站读取数据并将该信息绘制在地图上。 我有一个以
开头的套接字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.
这里是在哪里进行上述更改的演练,这里有一个与您的情况类似的情况得到解决。