为收到的每封邮件添加延迟的最佳方法?

时间:2018-02-19 11:30:47

标签: c# tcp latency

我有一个客户端 - 服务器架构,我每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处等间隔。

关于问题的任何想法?

1 个答案:

答案 0 :(得分:0)

创建新的DelayedReceive时,无法保证它会立即启动,只是承诺代码将在某个时间点执行。

意思是,您的sw方法将在某个时间点被调用。但它不一定要马上。

可以在LatencyUp方法中引用外部变量(DelayedReceive=)时解释时序。多个任务可以在中推测错误的顺序。

另见: