Napisałem klasę, która implementuje interfejs:
class ITransferProgressClass : ITransferProgress
{
public static TextBox txt1 = new TextBox();
public void Report(long bytesTransferred)
{
txt1.Invoke(new Action(delegate()
{
txt1.Text = bytesTransferred.ToString();
}));
}
public void Report(long bytesTransferred, long totalSize)
{
}
}
W innej klasie tworzę obiekt tej klasy, dzięki czemu po wciśnięciu przycisku otrzymuję poprawną ilość aktualnie wysłanych bajtów w textboxie txt1. Dane te są wyświetlane na bieżąco (odświeżane szybciej niż 1s):
ITransferProgressClass progress = new ITransferProgressClass();
client.Send(message, cancellationToken, progress);
Na podstawie tych wysłanych danych i odmierzonego czasu chcę policzyć prędkość (może być w KB/s). I tu pojawia się problem: jak uzyskać takie dane odświeżane np. co 1s? Raz liczba wysłanych danych na sekundę będzie większa, raz mniejsza (w zależności od prędkości łącza). Spróbowałem coś takiego:
Stopwatch stopwatch = new Stopwatch();
public void Report(long bytesTransferred)
{
stopwatch.Start();
txt1.Invoke(new Action(delegate()
{
txt1.Text = (bytesTransferred / stopwatch.Elapsed.TotalMilliseconds).ToString();
}));
}
i to pokazuje liczbę B/ms, ale nie odświeża się - za każdym razem rośnie. Próbowałem też z timerami (InitializeTimer wywołuję w innej klasie, o której wspomniałem powyżej), lecz tutaj nic w textboxie się nie wyświetla:
private Timer timer;
private const double timerUpdate = 1000;
public static TextBox txt1 = new TextBox();
long actualBytes;
public void InitializeTimer()
{
timer = new Timer();
timer.Interval = (int)timerUpdate;
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
}
public void Report(long bytesTransferred)
{
actualBytes = bytesTransferred;
}
void timer_Tick(object sender, EventArgs e)
{
txt1.Text = actualBytes.ToString();
}
Starałem się jak najjaśniej opisać ten temat. Gdyby coś było niezrozumiałe, postaram się napisać inaczej.