在form1
的顶部,我有一个字符串数组和一个字符串文件名:
string[] stringProgressReport = new string[4];
string FileName = "";
然后在openfiledialog
我得到了FileName
.
然后我有两个事件:
private void videosInsertRequest_ResponseReceived(Video obj)
{
stringProgressReport[0] = obj.Status.UploadStatus;
backgroundWorker1.ReportProgress(0, 0);
}
和
private void videosInsertRequest_ProgressChanged(IUploadProgress obj)
{
stringProgressReport[1] = obj.Status.ToString();
backgroundWorker1.ReportProgress(0, 1);
double mbSent = ((double)obj.BytesSent) / (1 << 20);
stringProgressReport[2] = mbSent.ToString();
backgroundWorker1.ReportProgress(0, 2);
double percentComplete = ((double)obj.BytesSent) / totalBytes * 100;
stringProgressReport[3] = percentComplete.ToString();
backgroundWorker1.ReportProgress(0, 3);
}
totalBytes
应该是文件大小(以字节为单位),如果我的percentComplete
计算没有错。
然后,最后,我有一个backgroundworker1_progresschanged
事件:
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
int eventIndex = (int)e.UserState;
if (eventIndex == 0)
{
toolStripStatusLabel1.Text = stringProgressReport[0];
}
else
{
toolStripStatusLabel2.Text = stringProgressReport[1];
}
}
当我在两个事件中报告stringProgressReport
中的两个项目的进展时,它工作正常。
但是现在,在报告4个项目时,我应该如何处理backgroundworker1_progresschanged
事件中的IF
?
以及如何计算percentComplete
并获取文件大小(以字节为单位)?
获取文件大小(以字节为单位)。我想我明白了。我正在做:
using (FileStream fileStream = File.OpenRead(FileName))
{
totalBytes = fileStream.Length;
}
totalBytes
是long
和全局的类型。我在选择文件后立即在openfiledialog
中执行此操作。
如果这部分没问题,现在我需要解决第二个问题。
我现在尝试在backgroundworker_progresschanged
中添加此行ELSE
:
toolStripProgressBar1.Value = Int32.Parse(stringProgressReport[3]);
但是我在这一行上得到了以下异常:
FormatException: Input string was not in a correct format
System.FormatException occurred
HResult=-2146233033
Message=Input string was not in a correct format.
Source=mscorlib
StackTrace:
at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal)
at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info)
at System.Int32.Parse(String s)
at Youtube_Manager.Form1.backgroundWorker1_ProgressChanged(Object sender, ProgressChangedEventArgs e) in d:C-SharpYoutube-ManagerYoutube-ManagerYoutube-ManagerForm1.cs:line 313
InnerException:
好吧,至少可以说,您的报告方式有点不寻常。 但是如果我尝试遵循您的模式,那么您backgroundWorker1_ProgressChanged
可能会想要更改为以下内容:
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
int eventIndex = (int)e.UserState;
if (eventIndex == 0) // upload status.
{
toolStripStatusLabel1.Text = stringProgressReport[0];
}
else if (eventIndex == 1) // obj.Status
{
toolStripStatusLabel2.Text = stringProgressReport[1];
}
else if (eventIndex == 2) // mb sent so far
{
// ??? where do you want to put this ??? = stringProgressReport[2];
}
else if (eventIndex == 3) // percent complete
{
toolStripProgressBar1.Value = Int32.Parse(stringProgressReport[3]);
}
else
{
throw new Exception("Invalid event index: " + eventIndex);
}
}
然后,回答你的第二个问题:toolStripProgressBar1.Value = Int32.Parse(stringProgressReport[3]);
抛出FormatException
的原因是因为你试图格式化一个小数。 由于您想将其用作整数,因此我建议修复以下 2 行:
double percentComplete = ((double)obj.BytesSent) / totalBytes * 100;
stringProgressReport[3] = percentComplete.ToString();
。通过将它们更改为 this 以确保您确实有一个整数:
int percentComplete = (int)Math.Round(((double)obj.BytesSent) / totalBytes * 100);
stringProgressReport[3] = percentComplete.ToString();