为什么当报告后台工作人员的进度改变到进度条时,我获得例外的百分比?

时间:2015-12-03 23:11:32

标签: c# .net winforms

progresschanged事件中的代码:

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            int eventIndex = 0;
            try
            {
                eventIndex = (int)e.UserState;
            }
            catch
            {
                MessageBox.Show(e.UserState == null ? "null" : e.UserState.GetType().FullName);
                throw;
            }
            else if (eventIndex == 4) // percent complete
            {
                progressBar1.Value = Int32.Parse(stringProgressReport[4]);
            }
            else
            {
                throw new Exception("Invalid event index: " + eventIndex);
            }
        }

然后在youtube的上传事件中我有这段代码:

string failed = "";
        double mbSent = 0;
        int percentComplete = 0;
        VideoProcessingDetailsProcessingProgress vp = new VideoProcessingDetailsProcessingProgress();
        private void videosInsertRequest_ProgressChanged(IUploadProgress obj)
        {
            stringProgressReport[1] = "Uploading";
            ulong? ul = vp.TimeLeftMs;
            stringProgressReport[1] = obj.Status.ToString();
            if (stringProgressReport[1] == "Uploading")
            {
                fileuploadpercentages = (int)Math.Round(((double)obj.BytesSent) / totalBytes * 100);
                stringProgressReport[4] = fileuploadpercentages.ToString();
                backgroundWorker1.ReportProgress(0, 4);
                stopwatch.Start();
                uploadstatus = "uploading file";
            }

首先,我看到使用断点,在backgroundworker progresschanged事件中,progressbar得到的值为0。 第二个问题是我在线上获得例外:

progressBar1.Value = Int32.Parse(stringProgressReport[4]);

输入字符串的格式不正确

现在我看到变量fileuploadpercentages是8,但我得到了这个例外。

当使用断点时,我在变量stringProgressReport中看到:

[0]   null
[1]   "Uploading"
[2]   "0"
[3]   "0"
[4]   "null"

首先,如果索引4是" 0"我为什么会得到异常? ? 第二个为什么报告一直是0?

1 个答案:

答案 0 :(得分:0)

如果没有可靠地重现问题的a good, minimal, complete code example,则无法解释您询问的每个细节。但当然可以说一些有用的东西:

  

首先,如果索引4为“0”,我会得到异常?

正如您在stringProgressReport的调试器显示中看到的那样,索引4的值为"null",而不是"0"。尝试将字符串"null"解析为Int32值将抛出您看到的异常。

您发布的代码清楚地将您的百分比计算分配给元素4

stringProgressReport[4] = fileuploadpercentages.ToString();

但是显而易见的是调试器信息(这里没有人可以确认或反驳,缺少完整的代码示例)表明其他东西已将"null"的值放在该元素位置。

除非并且直到您将共享与所述观察一致的代码示例,否则无法确定发生了什么。

请注意,抛出异常后,代码永远不会足够设置ProgressBar.Value属性。所以它可能保持在0的价值并不奇怪。

  

为什么报告始终为0?

我不确定这个问题是什么意思。它没有报告0。它正在报告"null"

由于您发布的代码与您发布的数组不匹配,我想该代码的其他部分可能与您实际调试的内容不匹配。例如,您是否以不同的方式编写了fileuploadpercentages计算 - 例如通过在表达式中的第一个除法之前省略强制转换为double - 那么这将解释0的计算值。

但是,如果没有一个好的代码示例,就不可能解释你说的发生了什么。


我同意有关您的代码的其他注释,例如将状态从您的工作代码传递到progress事件处理程序以及忽略percentProgress方法的ReportProgress()参数的非常奇怪和非常错误的方法。

我也同意,一般情况下你不应该使用毯子catch,但在这种情况下你重新抛出异常,所以你并没有真正处理它,而只是简单地观察它。后者不是一个问题(在很多情况下,正确的做法,虽然在展开堆栈的过程中显示一个消息框不一定是世界上最好的想法:) )。