5

重複の可能性:
関数が実行されている時間を測定する方法は?

信頼性の高いデータ転送を備えたUDPチャットを書いています。パケットが送信されたときにタイマーを開始し、サーバーから応答を受信したらすぐにタイマーを停止する必要があります(ACK-確認応答)。

これが私のコードです:

 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;
           }

ありがとうございました。

4

2 に答える 2

34

タイマーは使用しないでください。通常は十分に正確ではなく、この作業のために設計されたより単純なオブジェクト、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);
    }
}

あなたの場合、パケットが送信されたときに開始し、ackが受信されたときに停止します。

于 2012-12-07T16:59:55.060 に答える
2

Stopwatchこれについては、どのタイマーよりもはるかに優れています。

var stopwatch = new System.Diagnostics.Stopwatch();
stopwatch.Start();

// Your code here.

stopwatch.Stop();

Elapsed次に、 (タイプの) プロパティにアクセスしてTimeSpan、経過時間を確認できます。

于 2012-12-07T17:02:10.507 に答える