2017-03-24 3 views
0

C#에서 다이얼러 프로그램이 있습니다. 다운로드/업로드가 진행 중이면 이미지를 변경하고 싶었습니다. 이러한 코드를 다음 코드에 어떻게 추가 할 수 있습니까?C#에서 다운로드 업로드 바이트가 더 큰지 확인하십시오.

private void UpdateNetworkInterface() 
    { 
     this.Invoke((MethodInvoker)delegate 
     { 
      NetworkInterface nic = nicArr[cmbInterface.SelectedIndex]; 
      IPv4InterfaceStatistics interfaceStats = nic.GetIPv4Statistics(); 
      long lngBytesSent = 0; 
      long lngBtyesReceived = 0; 
      int bytesSentSpeed = (int)(interfaceStats.BytesSent - lngBytesSent) /1024; 
      int bytesReceivedSpeed = (int)(interfaceStats.BytesReceived - lngBtyesReceived) /1024; 
      // Update the labels 
      lblInterfaceType.Text = nic.NetworkInterfaceType.ToString(); 
      lblUpload.Text = bytesSentSpeed.ToString() + " KB"; 
      lblDownload.Text = bytesReceivedSpeed.ToString() + " KB"; 
      //this.StatusTextBox.AppendText(string.Format("{0}\r\n\r\n DOWNLOAD/UPLOAD in progress", "")); 
     }); 
    } 

답변

0

이러한 속성은 전송 된 총 바이트 수를 제공합니다. 필요한 숫자는 해당 숫자의 파생물입니다 (변경 비율).

가장 쉬운 방법은

그래서 당신이 속도를 얻기 위해 두 점을 비교 한 후 녹음을해야합니다 간단한 수학 문제를 다만됩니다.

private long _lastBytesRecevied; 
private long _lastBytesSent; 
private DateTime _lastReceivedMesurement; 
private DateTime _lastSentMesurement; 

//This needs to be done once at the start of the class to "seed" the first value. 
private Init() 
{ 
    _lastReceivedMesurement = DateTime.UtcNow; 
    _lastBytesRecevied = interfaceStats.BytesReceived; 

    _lastSentMesurement = DateTime.UtcNow; 
    _lastBytesSent = interfaceStats.BytesSent; 
} 

private double getKBDownloadSpeed() 
{ 
    double result = (interfaceStats.BytesReceived - _lastBytesRecevied)/(DateTime.UtcNow - _lastReceivedMesurement).TotalSeconds; 

    _lastReceivedMesurement = DateTime.UtcNow; 
    _lastBytesRecevied = interfaceStats.BytesReceived; 

    return result/1024d; 
} 

private double getKBUploadSpeed() 
{ 
    double result = (interfaceStats.BytesSent - _lastBytesSent)/(DateTime.UtcNow - _lastSentMesurement).TotalSeconds; 

    _lastSentMesurement = DateTime.UtcNow; 
    _lastBytesSent = interfaceStats.BytesSent; 

    return result/1024d; 
} 

이제 두 함수는 함수가 호출 된 마지막 시간과 현재 호출 사이의 평균 다운로드 속도를 반환합니다.

다운로드 속도가 좋아지면 이미지를 다운로드 아이콘으로 변경하십시오. 업로드 속도에서 값을 얻으면 이미지를 업로드 아이콘으로 변경하십시오.

감사

,

Thiyagu 라 젠드 란

**가 도움이된다면 답변으로 응답을 표시하십시오.

+0

Gr8. 그러나 나는 프로그래밍에 아주 익숙하다. 용서해주십시오. 위 코드를 어디에 넣어야합니까? –

+0

변수가 전역 변수 섹션에 있습니다 (메소드에없는 클래스 내의 변수). Init()의 코드를 UpdateNetworkInterface에 복사하고 코드에 두 줄을 추가하십시오. var averagedownspeed = getKBDownloadSpeed ​​(); var averageupspeed = getKBUploadSpeed ​​(); 클래스 내의 2 가지 메소드를 복사하십시오. IPv4InterfaceStatistics interfaceStats 변수를 전역 변수로 설정하십시오. ** 잊지 마십시오. –

+0

나를위한 작동 코드. 작동하는 경우 다른 프로그래머가이 대답을 찾을 수 있도록 답으로 표시하십시오. –

0

System.Net.WebClient을 사용할 수 있습니다.

이벤트는 DownloadProgressChanged이며 매개 변수가 있고 다운로드 한 바이트와 파일의 총 바이트가 들어있는 필드가 있습니다.

WebClient.DownloadFileAsync()에 의해 해고됩니다.

MSDN 링크 : https://msdn.microsoft.com/en-us/library/system.net.webclient(v=vs.110).aspx

예 :

private void DownloadChanged(object sender, DownloadProgressChangedEventArgs e) 
{ 
    labelProgress.Text = string.Format("{0} Percents Completed", 
       e.BytesReceived/e.TotalBytesToReceive * 100); 

} 

private void StartDownload(object sender, EventArgs e) // Button Event 
{ 
    var webClient = new WebClient(); 
    webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadChanged); 
    webClient.DownloadFileAsync(/* URL */); 
} 

얻기 업로드 바이트는 다운로드 한 동일합니다. 해피 프로그래밍! :)

+0

WebClient,이 방법은 파일을 다운로드하여 대역폭을 테스트하려는 경우에 유용합니다. 내 실제 질문으로는 donwload xx KB/S와 같이 실시간으로 네트워크 인터페이스 트래픽을 모니터하는 방법이었습니다. –