多线程报告进度不起作用

时间:2012-02-11 17:19:31

标签: c# .net winforms multithreading backgroundworker

我最近开始使用多线程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)调用替换计算,它会更新。

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分:0)

  

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

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

操作发生在所涉及的大多数precice变量类型上。

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

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