我有一个全局变量,我得到了DateTime.Now,一旦我点击一个按钮:
dt = DateTime.Now;
然后在我正在做的progresschanged事件中:
var currentTime = DateTime.Now;
现在我需要以秒为单位计算currentTime和存储时间(dt)之间的差异。然后我需要以秒为单位除以BytesSent。
这是我正在使用的progresschanged事件:
double mbSent = 0;
int percentComplete = 0;
static string progress = "";
static string ttt = "";
private void videosInsertRequest_ProgressChanged(IUploadProgress obj)
{
stringProgressReport[1] = obj.Status.ToString();
backgroundWorker1.ReportProgress(0, 1);
mbSent = ((double)obj.BytesSent) / (1 << 20);
stringProgressReport[2] = mbSent.ToString();
backgroundWorker1.ReportProgress(0, 2);
percentComplete = (int)Math.Round(((double)obj.BytesSent) / totalBytes * 100);
stringProgressReport[3] = percentComplete.ToString();
backgroundWorker1.ReportProgress(0, 3);
var currentTime = DateTime.Now;
}
在事件的底部,我需要进行计算,这样我就可以报告平均速度。文件上传速度。
修改
我在做的时候会遇到异常:
var currentTime = DateTime.Now;
TimeSpan diff = currentTime - dt;
int diffSeconds = (int)diff.TotalSeconds;
long averageSpeed = obj.BytesSent / diffSeconds;
obj.BytesSent和diffSeconds都是0所以我得到的异常不能在averageSpeed上除以零。
为什么diffSeconds为0?试图计算dt和currentTime之间的时差。
修改
这就是我现在所做的:
if (obj.BytesSent != 0)
{
var currentTime = DateTime.Now;
TimeSpan diff = currentTime - dt;
var diffSeconds = (DateTime.Now - dt).TotalSeconds;
long averageSpeed = diffSeconds != 0 ? obj.BytesSent / diffSeconds : 0L;
double MBunits = ConvertBytesToMegabytes(averageSpeed);
stringProgressReport[4] = MBunits.ToString();
backgroundWorker1.ReportProgress(0, 4);
}
但现在在long averageSpeed转换类型double到long时会出现错误。
这是我用来转换为MegaBytes的方法:
static double ConvertBytesToMegabytes(long bytes)
{
return (bytes / 1024f) / 1024f;
}
在backgroundworker progresschanged事件中:
label8.Text = stringProgressReport[4];
如何向用户展示更好的内容?比如速度:
平均速度为:0.5 MB / s,然后是0.9 MB / s,然后是1.6 MB / s,这种格式或更好的东西。
答案 0 :(得分:3)
您可以简单地减去两个DateTime
个对象:
TimeSpan diff = currentTime - dt;
int diffSeconds = (int) diff.TotalSeconds;
答案 1 :(得分:2)
var elapedSeconds = (DateTime.Now-dt).TotalSeconds;
答案 2 :(得分:0)
您需要一些防御性编程来防止异常:
var diffSeconds = (DateTime.Now - dt).TotalSeconds;
long averageSpeed = diffSeconds !=0 ? obj.BytesSent / diffSeconds : 0L;