62,067
社区成员
发帖
与我相关
我的任务
分享
for (int i = 0; i < processRequest.Length; i++)
{
try
{
CometClient cometClient = this.stateManager.StateProvider.GetCometClient(processRequest[i].ClientPrivateToken);
if (processRequest[i].Active)
{
Thread.Sleep(1000);
这我就非常奇怪,既然for循环,而又sleep,你到底是要循环服务效率呢还是要阻塞?我在设计流程时,必须做到一个服务在处理业务或者甚至sleep的时候绝对不会影响其它的业务的并行处理,而你却自我阻塞了自己,所以我完全不理解你的基本的关于并发、异步的设计习惯,或许你从基础上就错了。
/// <summary>
/// 等待回调
/// </summary>
private void QueueCometWaitRequest_WaitCallback()
{
//这个循环就是将连接保持
while (true)
{
//Debug.WriteLine(string.Format("QueueCometWaitRequest_WaitCallback Tick: {0} {1} ", Thread.CurrentThread.IsThreadPoolThread, Thread.CurrentThread.ManagedThreadId));
CometWaitRequest[] processRequest;
lock (this.state)
{
processRequest = waitRequests.ToArray();
}
//
/*if (processRequest.Length == 0)
break;*/
if (processRequest.Length == 0)
{
//
Thread.Sleep(100);
}
else
{
for (int i = 0; i < processRequest.Length; i++)
{
try
{
CometClient cometClient = this.stateManager.StateProvider.GetCometClient(processRequest[i].ClientPrivateToken);
if (processRequest[i].Active)
{
Thread.Sleep(1000);
// 如果超时,则返回,并将请求从等待队列中移除
if (DateTime.Now.Subtract(processRequest[i].DateTimeAdded).TotalSeconds >= cometClient.ConnectionTimeoutSeconds)
{
// 移除请求
DeactivateCometWaitRequest(processRequest[i]);
// 发送超时消息
CometMessage timeoutMessage = new CometMessage()
{
MessageId = 0,
Name = "aspNetComet.timeout",
Contents = null
};
processRequest[i].Result.CometMessages = new CometMessage[] { timeoutMessage };
// 结束此次的请求
this.QueueCometWaitRequest_Finished(processRequest[i]);
}
else
{
//获取服务器上最新的消息
CometMessage[] messages = this.CheckForServerPushMessages(processRequest[i]);
if (messages != null && messages.Length > 0)
{
processRequest[i].Result.CometMessages = messages;
// 将消息返回,释放一个等待的请求
DeactivateCometWaitRequest(processRequest[i]);
// 将相应放入另一个ASP.NET线程中
this.QueueCometWaitRequest_Finished(processRequest[i]);
}
}
}
else
{
// 请求未连接则检查空闲的请求
this.CheckForIdleCometWaitRequest(processRequest[i], cometClient);
}
}
catch (Exception ex)
{
if (processRequest[i].Active)
{
//
DeactivateCometWaitRequest(processRequest[i]);
//
CometMessage errorMessage = new CometMessage()
{
MessageId = 0,
Name = "aspNetComet.error",
Contents = ex.Message
};
//
processRequest[i].Result.CometMessages = new CometMessage[] { errorMessage };
//
this.QueueCometWaitRequest_Finished(processRequest[i]);
}
else
{
// thread直接从队列中移除
this.DequeueCometWaitRequest(processRequest[i].ClientPrivateToken);
}
}
}
}
}
}
/// <summary>
/// 等待回调
/// </summary>
private void QueueCometWaitRequest_WaitCallback()
{
//这个循环就是将连接保持
while (true)
{
//Debug.WriteLine(string.Format("QueueCometWaitRequest_WaitCallback Tick: {0} {1} ", Thread.CurrentThread.IsThreadPoolThread, Thread.CurrentThread.ManagedThreadId));
CometWaitRequest[] processRequest;
lock (this.state)
{
processRequest = waitRequests.ToArray();
}
//
/*if (processRequest.Length == 0)
break;*/
if (processRequest.Length == 0)
{
//
Thread.Sleep(100);
}
else
{
for (int i = 0; i < processRequest.Length; i++)
{
try
{
CometClient cometClient = this.stateManager.StateProvider.GetCometClient(processRequest[i].ClientPrivateToken);
if (processRequest[i].Active)
{
Thread.Sleep(1000);
// 如果超时,则返回,并将请求从等待队列中移除
if (DateTime.Now.Subtract(processRequest[i].DateTimeAdded).TotalSeconds >= cometClient.ConnectionTimeoutSeconds)
{
// 移除请求
DeactivateCometWaitRequest(processRequest[i]);
// 发送超时消息
CometMessage timeoutMessage = new CometMessage()
{
MessageId = 0,
Name = "aspNetComet.timeout",
Contents = null
};
processRequest[i].Result.CometMessages = new CometMessage[] { timeoutMessage };
// 结束此次的请求
this.QueueCometWaitRequest_Finished(processRequest[i]);
}
else
{
//获取服务器上最新的消息
CometMessage[] messages = this.CheckForServerPushMessages(processRequest[i]);
if (messages != null && messages.Length > 0)
{
processRequest[i].Result.CometMessages = messages;
// 将消息返回,释放一个等待的请求
DeactivateCometWaitRequest(processRequest[i]);
// 将相应放入另一个ASP.NET线程中
this.QueueCometWaitRequest_Finished(processRequest[i]);
}
}
}
else
{
// 请求未连接则检查空闲的请求
this.CheckForIdleCometWaitRequest(processRequest[i], cometClient);
}
}
catch (Exception ex)
{
if (processRequest[i].Active)
{
//
DeactivateCometWaitRequest(processRequest[i]);
//
CometMessage errorMessage = new CometMessage()
{
MessageId = 0,
Name = "aspNetComet.error",
Contents = ex.Message
};
//
processRequest[i].Result.CometMessages = new CometMessage[] { errorMessage };
//
this.QueueCometWaitRequest_Finished(processRequest[i]);
}
else
{
// thread直接从队列中移除
this.DequeueCometWaitRequest(processRequest[i].ClientPrivateToken);
}
}
}
}
}
}