Calculate speed per sec and time left of sending a file using sockets tcp c#

前端 未结 3 1830
慢半拍i
慢半拍i 2021-01-15 04:16

How can I calculate the speed per sec, and the time left in sec? I\'ve tried to use:

void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
    l         


        
相关标签:
3条回答
  • 2021-01-15 04:36

    in form constructor

    Timer timer1 = new Time();
    public Form1()
        {
            InitializeComponent();
            this.timer1.Enabled = true;
            this.timer1.Interval = 1000;
            this.timer1.Tick += new System.EventHandler(this.timer1_Tick);
        }
    

    or add it from toolbox and set the previous values


    the sum of sent bytes should be public so our method can get its value every second

        long sentBytes = 0;      //the sent bytes that updated from sending method
        long prevSentBytes = 0;   //which references to the previous sentByte
        double totalSeconds = 0;   //seconds counter to show total time .. it increases everytime the timer1 ticks.
        private void timer1_Tick(object sender, EventArgs e)
        {
            long speed = sentBytes - prevSentBytes ;  //here's the Transfer-Rate or Speed
            prevSentBytes = sentBytes ;
            labelSpeed.Text = CnvrtUnit(speed) + "/S";   //display the speed like (100 kb/s) to a label
            if (speed > 0)                //considering that the speed would be 0 sometimes.. we avoid dividing on 0 exception
            {
                totalSeconds++;     //increasing total-time
                labelTime.Text = TimeToText(TimeSpan.FromSeconds((sizeAll - sumAll) / speed));
                //displaying time-left in label
                labelTotalTime.Text = TimeToText(TimeSpan.FromSeconds(totalSeconds));
                //displaying total-time in label
            }
        }
    
        private string TimeToText(TimeSpan t)
        {
            return string.Format("{2:D2}:{1:D2}:{0:D2}", t.Seconds, t.Minutes, t.Hours);
        }
    
        private string CnvrtUnit(long source)
        {
            const int byteConversion = 1024;
            double bytes = Convert.ToDouble(source);
    
            if (bytes >= Math.Pow(byteConversion, 3)) //GB Range
            {
                return string.Concat(Math.Round(bytes / Math.Pow(byteConversion, 3), 2), " GB");
            }
            else if (bytes >= Math.Pow(byteConversion, 2)) //MB Range
            {
                return string.Concat(Math.Round(bytes / Math.Pow(byteConversion, 2), 2), " MB");
            }
            else if (bytes >= byteConversion) //KB Range
            {
                return string.Concat(Math.Round(bytes / byteConversion, 2), " KB");
            }
            else //Bytes
            {
                return string.Concat(bytes, " Bytes");
            }
        }
    
    0 讨论(0)
  • 2021-01-15 04:41

    You may do some smoothing of the transfer speed to avoid jumping of the value. See http://en.wikipedia.org/wiki/Moving_average for one option. Basically compute some sort of average for the speed over time.

    0 讨论(0)
  • 2021-01-15 04:41

    You can't fix that. The only way to 'fix' it is by creating a constant speed network/internet.

    the network (and your computer) does not have a constant speed.

    The calculation tells you what it is.

    0 讨论(0)
提交回复
热议问题