在单独的线程中使用Progressbar,以便在两个不同的任务中同时运行

时间:2012-09-28 12:59:46

标签: c# .net desktop-application

我想同时运行两个函数。

第一个函数将计算我的计算机中的文件总数,并将在一个DatagridView中显示结果。

在第二个函数中,一个进度条的值将根据文件总数进行更改,这意味着当所有文件都绑定在DatagridView中时,进度条的值将设置为100。

我想同步两个函数的工作,我使用两个线程,但结果没有显示,发生了异常。

我该怎么办?

我的代码是

 ThreadStart threadstatr = new ThreadStart(Function_1);
 ThreadStart threaProgress = new ThreadStart(Function_2);
 Thread thread = new Thread(threadstatr);
 Thread threadpro = new Thread(threaProgress);
 thread.Start();
 threadpro.Start();
 thread.Join();
 threadpro.Join();

void Function_2()
    {
        int coun = ((Convert.ToInt32(label1.Text)) / 100); //here label1 represents total no. of files
        for (int i = 0; i < coun; i++)
        {
            backgroundWorker1.ReportProgress(i);
        }
    }

并且异常是“输入字符串格式不正确”。因为标签没有机会更新自己

2 个答案:

答案 0 :(得分:0)

嗯它似乎比它需要的要复杂一些。使用BackgroundWorker应该可以完全避免原始Thread对象(ThreadStart等)。

您有一个主应用程序/ UI线程,您的进度条会被实例化 您希望使用BackgroundWorker来启动线程来完成工作 - 将您的工作(搜索文件)方法连接到BackgroundWorker.DoWork事件。
该方法可以使用BackgroundWorker.ReportProgress方法将进度报告回UI线程。 您的UI线程可以通过处理BackgroundWorker.ProgressChanged事件来响应进度(增量进度控制) 在创建BackgroundWorker时不要忘记设置BackgroundWorker.WorkerReportsProgress = true

通过查看BackgoundWorker的文档,您可以获得更多详细信息。

答案 1 :(得分:0)

不要重复另一个答案和我的评论,但你似乎没有听。

删除线程。代码中没有ThreadStart。

不要从后台读取UI控件 传递数据:

backgroundWorker1.RunWorkerAsync(numberToCompute);

使用BackgroundWorker。

如果您愿意,这正是您所需要的。

BackgroundWorker Class