【问题标题】:Multi-threading Report Progress Not Working多线程报告进度不工作
【发布时间】:2012-02-11 17:19:30
【问题描述】:

我最近开始使用多线程 Winform 应用程序,遇到了一个我不明白的问题。

基本上,当我尝试让后台工作人员报告其进度并且该进度来自计算时,它始终为零。

//making background worker
        BackgroundWorker myJanitor = new BackgroundWorker();
        myJanitor.WorkerSupportsCancellation = true;
        myJanitor.WorkerReportsProgress = true;
        myJanitor.DoWork += new DoWorkEventHandler(cleanContactList);
        myJanitor.ProgressChanged += new ProgressChangedEventHandler(myCleaningWorker_ProgressChanged);
        myJanitor.RunWorkerAsync();    

“cleanContactList”方法循环遍历 DataGridView 的行,在此期间我尝试如下操作:

int percentComplete = (myRow.Index  / contactGridView.Rows .Count ) * 100;                       
(sender as BackgroundWorker).ReportProgress(percentComplete);

令人沮丧的是,percentComplete 总是为零。如果我调试它,我可以看到发生了实际计算(例如 [2000/10000]*100),但结果始终为零。

我在这里缺少什么?如果我用 Random.Next(0,100) 替换计算,则称它更新正常。

【问题讨论】:

    标签: c# .net winforms multithreading backgroundworker


    【解决方案1】:

    尝试索引 * 100/计数。我认为您将两个整数除以 0,然后乘以 100。

    例如,这个:

            int index = 50;
            int count = 100;
    
            int percent = index/count * 100;
            int percent2 = index * 100/count;
    
            Console.WriteLine("{0} & {1}", percent, percent2);
    

    输出 0 和 50。

    【讨论】:

    • 嗯,这很简单。谢谢!
    • 我不得不等 8 分钟才让我 :)
    • 哦 - 不记得了 :) 谢谢。编码愉快。
    【解决方案2】:

    [2000/10000]*100) 但结果始终为零

    C#101 适合初学者。实际上更多的编程 - 在大多数知道变量类型的语言中都是一样的。

    操作发生在所涉及的最精确的变量类型上。

    2000 (integer) / 10000 (integer) 是整数结果舍入 = 0

    我建议你先乘,然后除。或者在变量或公式中选择不同的变量类型(即 [(float)2000 会将整个公式转换为使用浮点数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-30
      • 1970-01-01
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多