【问题标题】:How can i report the progress to label or a backgroundworker from static class?如何从静态类向标签或后台工作人员报告进度?
【发布时间】:2016-06-15 00:14:52
【问题描述】:
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\\");

然后我可以报告计数,但这是在过程的最后。 我想报告两次进度。第一次获取目录时:

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

在这里向progresschanged事件报告目录名称,同时统计目录数量并实时报告计数。

第二:

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()
                    }

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

问题是因为它是静态的,所以我不能从类内部调用任何控件,而不是 backgroundworker 和标签。

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

    为您的静态Iterate 方法添加一个回调参数。在实例iterate 方法中适当调用回调,以通知调用者进度更新。

    您还需要在 DirectoryIterator 类上接受回调的私有构造函数。例如:

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

    如果您需要做的只是报告当前的迭代计数,则回调可以像 Action&lt;int&gt; 一样简单。

    【讨论】:

      猜你喜欢
      • 2010-10-25
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多