为什么在向后台工作人员报告进度时,它从未进入progresschanged事件?

时间:2016-06-14 17:58:42

标签: c# .net winforms

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Security.AccessControl;
using System.Security.Principal;
using System.Runtime.InteropServices;

namespace Search_Text_In_Files
{
    public partial class Form1 : Form
    {
        StreamWriter w = new StreamWriter(@"e:\textresults.txt");
        ProgressBarWithText pbt = new ProgressBarWithText();

        public Form1()
        {
            InitializeComponent();

            pbt.Size = new Size(984, 23);
            pbt.Location = new Point(12, 358);
            this.Controls.Add(pbt);

            backgroundWorker1.RunWorkerAsync();
        }

        bool result = false;
        public List<string> FindLines(string DirName, string TextToSearch)
        {
            int counter = 0;
            List<string> findLines = new List<string>();
            DirectoryInfo di = new DirectoryInfo(DirName);
            List<FileInfo> l = new List<FileInfo>();
            CountFiles(di, l, count =>
            {
                backgroundWorker1.ReportProgress(count, "Counting Files");
            });
            int totalFiles = l.Count;
            int countFiles = 0;
            if (di != null && di.Exists)
            {
                if (CheckFileForAccess(DirName) == true)
                {
                    foreach (FileInfo fi in l)
                    {
                        backgroundWorker1.ReportProgress((int)((double)countFiles / totalFiles * 100.0), fi.Name);
                        countFiles++;
                        System.Threading.Thread.Sleep(1);

                        if (string.Compare(fi.Extension, ".cs", true) == 0)
                        {
                            using (StreamReader sr = fi.OpenText())
                            {
                                string s = "";
                                while ((s = sr.ReadLine()) != null)
                                {
                                    if (s.Contains(TextToSearch))
                                    {
                                        counter++;
                                        findLines.Add(s);
                                        result = true;
                                        backgroundWorker1.ReportProgress(0, fi.FullName);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return findLines;
        }

        private void CountFiles(DirectoryInfo di, List<FileInfo> l, Action<int> CurrentCount) {
            foreach (DirectoryInfo dir in di.GetDirectories())
                CountFiles(dir, l, currentCount=> {
                    CurrentCount(l.Count);

                });
        }

        private bool CheckForAccess(string PathName)
        {
            if (File.Exists(PathName) == true)
                return CheckFileForAccess(PathName);

            if (Directory.Exists(PathName) == true)
                return CheckFolderForAccess(PathName);

            return false;
        }

        private bool CheckFileForAccess(string FileName)
        {
            FileSecurity fs = new FileSecurity(FileName, AccessControlSections.Access);
            if (fs == null)
                return false;

            AuthorizationRuleCollection TheseRules = fs.GetAccessRules(true, true, typeof(NTAccount));
            if (TheseRules == null)
                return false;

            return CheckACL(TheseRules);
        }

        private bool CheckFolderForAccess(string FolderName)
        {
            DirectoryInfo di = new DirectoryInfo(FolderName);
            if (di == null)
                return false;

            DirectorySecurity acl = di.GetAccessControl(AccessControlSections.Access);
            if (acl == null)
                return false;

            AuthorizationRuleCollection TheseRules = acl.GetAccessRules(true, true, typeof(NTAccount));
            if (TheseRules == null)
                return false;

            return CheckACL(TheseRules);
        }

        private bool CheckACL(AuthorizationRuleCollection TheseRules)
        {
            foreach (FileSystemAccessRule ThisRule in TheseRules)
            {
                if ((ThisRule.FileSystemRights & FileSystemRights.Read) == FileSystemRights.Read)
                {
                    if (ThisRule.AccessControlType == AccessControlType.Deny)
                        return false;
                }
            }

            return true;
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            FindLines(@"d:\c-sharp", "FileShellExtension");
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            if (e.UserState.ToString() == "Counting Files")
                label2.Text = e.UserState.ToString();
            pbt.Value = e.ProgressPercentage;
            pbt.Text = e.ProgressPercentage.ToString() + "%";
            pbt.Invalidate();
            label2.Text = e.UserState.ToString();
            if (result == true)
            {
                listView1.Items.Add(e.UserState.ToString());
                result = false;
            }
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled == true)
            {

            }
            else if (e.Error != null)
            {

            }
            else
            {

            }
        }

        public class ProgressBarWithText : ProgressBar
        {
            const int WmPaint = 15;
            SizeF TextSize;
            PointF TextPos;
            bool dontpaint = false;

            public ProgressBarWithText()
            {
                this.DoubleBuffered = true;
                this.TextChanged += ProgressBarWithText_TextChanged;
                this.SizeChanged += ProgressBarWithText_SizeChanged;
            }

            public override string Text
            {
                get { return base.Text; }
                set { base.Text = value; }
            }

            void RecalcTextPos()
            {
                if (this.IsDisposed == true)
                    return;
                if (string.IsNullOrEmpty(base.Text))
                    return;

                using (var graphics = Graphics.FromHwnd(this.Handle))
                {
                    TextSize = graphics.MeasureString(base.Text, this.Font);
                    TextPos.X = (this.Width / 2) - (TextSize.Width / 2);
                    TextPos.Y = (this.Height / 2) - (TextSize.Height / 2);
                }
            }

            void ProgressBarWithText_SizeChanged(object sender, EventArgs e)
            {
                RecalcTextPos();
            }

            void ProgressBarWithText_TextChanged(object sender, EventArgs e)
            {
                RecalcTextPos();
            }

            protected override void WndProc(ref System.Windows.Forms.Message m)
            {
                base.WndProc(ref m);

                if (dontpaint == false)
                {
                    switch (m.Msg)
                    {
                        case WmPaint:
                            using (var graphics = Graphics.FromHwnd(Handle))
                                graphics.DrawString(base.Text, base.Font, Brushes.Black, TextPos.X, TextPos.Y);

                            break;
                    }
                }
            }

            protected override CreateParams CreateParams
            {
                get
                {
                    CreateParams result = base.CreateParams;
                    result.ExStyle |= 0x02000000; // WS_EX_COMPOSITED 
                    return result;
                }
            }
        }
    }
}

FindLines方法我将其称为dowork事件:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            FindLines(@"d:\c-sharp", "FileShellExtension");
        }

在FindLines方法中,我在两个地方使用reportprogress:

CountFiles(di, l, count =>
            {
                backgroundWorker1.ReportProgress(count, "Counting Files");
            });
            int totalFiles = l.Count;
            int countFiles = 0;
            if (di != null && di.Exists)
            {
                if (CheckFileForAccess(DirName) == true)
                {
                    foreach (FileInfo fi in l)
                    {
                        backgroundWorker1.ReportProgress((int)((double)countFiles / totalFiles * 100.0), fi.Name);

但它永远不会进入progresschanged事件。 我在设计器中检查了属性:WorkerReportsProgress设置为true。

0 个答案:

没有答案