如何向静态类中的标签或后台工作人员报告进度?

时间:2016-06-15 00:14:53

标签: c# .net winforms

START_DATE_TIME       END_DATE_TIME          PRICE
20160101 20:00:00     20160102 00:00:00      1.999
20160102 00:00:00     20160103 00:00:00      1.999
20160103 00:00:00     20160104 00:00:00      1.999
20160104 00:00:00     20160104 04:00:00      1.999

使用它:

public class DirectoryIterator
        {
            public static int Iterate(string root)
            {
                var iterator = new DirectoryIterator();
                iterator.iterate(root);
                return iterator.count;
            }

            private void iterate(string root)
            {
                try
                {
                    foreach (string directory in Directory.EnumerateDirectories(root))
                        iterate(directory);

                    foreach (string file in Directory.EnumerateFiles(root, "*.txt"))
                    {
                        // load(file);

                        ++count;

                        // Now count is the actual number of files processed,
                        // so you can use it for updateProgress()
                    }
                }
                catch
                {

                }
            }

            private int count;

            private DirectoryIterator() { }
        }

然后我可以报告计数,但这是在流程结束时。 我想两次报告进展情况。第一次获取目录时:

int count = DirectoryIterator.Iterate("C:\\temp\\");

在此向reportchanged事件报告目录名称,并计算目录数量并实时报告计数。

第二

foreach (string directory in Directory.EnumerateDirectories(root))
                        iterate(directory);

在此处实时报告文件名称和文件数。

问题是因为它是静态的我不能从类内部调用任何控件而不是背景工作者而不是标签。

1 个答案:

答案 0 :(得分:2)

为静态Iterate方法添加回调参数。在实例iterate方法中根据需要调用回调,以通知调用者进度更新。

您还需要DirectoryIterator类上的私有构造函数来接受回调。 E.g:

public static int Iterate(string root, Action<int> callback)
{
    var iterator = new DirectoryIterator(callback);
    iterator.iterate(root);
    return iterator.count;
}

如果你需要做的就是报告当前的迭代次数,回调可以像Action<int>一样简单。