我有一个客户端 - 服务器架构,我每70毫秒从客户端向服务器发送消息。在服务器端,我想介绍一个模拟的网络延迟。为此,我有以下内容:
//Receive incoming messages and put into temp queue.
private void DataReceived(object sender, DataReceivedEventArgs args)
{
TemporaryRawMessages.Enqueue(args.Bytes);
args.Recycle();
}
//Runs on separate thread
void ProcessMessages()
{
while (true)
{
if (TemporaryRawMessages.Count > 0)
{
var raw = TemporaryRawMessages.Dequeue();
Task taskA = Task.Factory.StartNew(() => DelayedReceive(raw));
}
}
}
//Process the received message
void DelayedReceive(byte[] raw_message)
{
//wait a bit before deserialising and queueing the message
while (sw.ElapsedMilliseconds < LatencyUp) { }
var message = (ClientToServerMessage)Utils.Deserialize(raw_message);
Messages_In.Enqueue(message);
}
服务器收到一条消息并将其放入临时队列。
接下来,ProcessMessages()
会接收任何新消息并生成一个新任务。在将消息放入另一个队列之前,任务会稍稍等待,该队列由主程序拾取。
问题是如果我计时DelayedReceive,我会看到时间如:3,241,46,99,......没有一致性。每条消息应延迟70毫秒,抵消网络延迟。换句话说,所有消息都延迟了X(例如100ms),但是在70ms处等间隔。
关于问题的任何想法?
答案 0 :(得分:0)
创建新的DelayedReceive
时,无法保证它会立即启动,只是承诺代码将在某个时间点执行。
意思是,您的sw
方法将在某个时间点被调用。但它不一定要马上。
可以在LatencyUp
方法中引用外部变量(DelayedReceive
和=
)时解释时序。多个任务可以在中推测错误的顺序。
另见: