110,537
社区成员
发帖
与我相关
我的任务
分享
void AdjustDelayTime(uint usedTime)
{
if (oldUsedTime == 0)
{
oldUsedTime = usedTime;
}
else
{
int result=usedTime.CompareTo(oldUsedTime * 2);
if (result < 0)
{
delayTime -= 3;
}
else if (result > 0)
{
delayTime += 3;
}
if (delayTime<3)
{
delayTime = 3;
}
if (delayTime>30)
{
delayTime = 30;
}
oldUsedTime = usedTime;
}
}
void UpdateTagScreen_FeedBack(ReceiveData receiveData)
{
asyncConnectionInformationList.Where(p => p.ID == receiveData.id).First().AutoResetEvent.Set();
OnUpdateTagScreenAsyncFeedBack?.Invoke(receiveData.id, receiveData.data[1], receiveData.data[3] == 1);
}
sendBytes[10] = numberBytes[1];
sendBytes[11] = 0;
sendBytes[12] = 0;
AsyncConnectionInformation asyncConnectionInformation = asyncConnectionInformationList.Where(p => p.ID == id).FirstOrDefault();
if (asyncConnectionInformation == null)
{
return false;
}
bool result = false;
try
{
uint startTime = timeGetTime(); // 高精度计时器
asyncConnectionInformation.UpdateTagTotalTimeList[interAddress - 1] = 0;
Thread.Sleep(delayTime);
result = Send(asyncConnectionInformation, sendBytes, timeOut);
if (result)
{
result = asyncConnectionInformation.AutoResetEvent.WaitOne(timeOut);
if (result)
{
asyncConnectionInformation.UpdateTagTotalTimeList[interAddress - 1] = timeGetTime() - startTime;
// AdjustDelayTime(asyncConnectionInformation.UpdateTagTotalTimeList[interAddress - 1]);
}
}
}
finally
{
timeEndPeriod(1);
}
return result;
lock(sb)
{
对B进行阻塞式地一问一答();
}
使得异步变为同步、多线程被卡成单线程,多垃圾的东西都能 lock 阻塞排队。
this.maxConnectNumber = maxConnectNumber;
this.receiveBufferSize = receiveBufferSize;
bufferManager = new BufferManager(receiveBufferSize * maxConnectNumber * 2, receiveBufferSize);
socketAsyncEventArgsStack = new SocketAsyncEventArgsStack(maxConnectNumber);
maxConnectCountSemaphore = new Semaphore(maxConnectNumber, maxConnectNumber);
asyncConnectionInformationList = new List<AsyncConnectionInformation>();
SocketAsyncEventArgs readWriteEventArg;
for (int i = 0; i < maxConnectNumber; i++)
{
readWriteEventArg = new SocketAsyncEventArgs();
readWriteEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(IO_Completed);
readWriteEventArg.UserToken = new AsyncConnectionInformation();
bufferManager.SetBuffer(readWriteEventArg);
socketAsyncEventArgsStack.Push(readWriteEventArg);
}