我正在编写一个带有可靠数据传输的UDP聊天。我需要在发送数据包时启动计时器,并在收到服务器的答复后立即停止(确认 - 确认)。
这是我的代码:
private void sendButton_Click(object sender, EventArgs e)
{
Packet snd = new Packet(ack, textBox1.Text.Trim());
textBox1.Text = string.Empty;
Smsg = snd.GetDataStream();//convert message into array of bytes to send.
while (true)
{
try
{ // Here I need to Start a timer!
clientSock.SendTo(Smsg, servEP);
clientSock.ReceiveFrom(Rmsg, ref servEP);
//Here I need to stop a timer and get elapsed amount of time.
Packet rcv = new Packet(Rmsg);
if (Rmsg != null && rcv.ACK01 != ack)
continue;
if (Rmsg != null && rcv.ACK01 == ack)
{
this.displayMessageDelegate("ack is received :"+ack);
ChangeAck(ack);
break;
}
谢谢。
答案 0 :(得分:24)
不要使用计时器。它通常不够准确,并且只为这项工作设计了一个更简单的对象:Stopwatch类。
MSDN文档中的代码示例:
using System;
using System.Diagnostics;
using System.Threading;
class Program
{
static void Main(string[] args)
{
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
Thread.Sleep(10000);
stopWatch.Stop();
// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;
// Format and display the TimeSpan value.
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
Console.WriteLine("RunTime " + elapsedTime);
}
}
在您的情况下,您在发送数据包时启动它,并在收到确认时停止它。
答案 1 :(得分:2)
Stopwatch
比任何计时器都要好得多。
var stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start();
// Your code here.
stopwatch.Stop();
然后您可以访问Elapsed
属性(TimeSpan
类型)以查看已用时间。