启动时的后工作滞后,多线程的拆分方法

时间:2016-04-01 12:30:46

标签: c# multithreading backgroundworker

以下代码用于搜索文件。问题是,当我选择一个大文件夹(如C盘)程序启动时有一些延迟。我想我需要将磁盘划分为更小的部分(文件夹)并在不同的线程上运行它,但我不知道如何。

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.Threading.Tasks;
using System.Threading;    
using System.IO;
using System.Collections;
using System.Diagnostics;

namespace failu_paieska
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            backgroundWorker1.WorkerReportsProgress = true;
            backgroundWorker1.WorkerSupportsCancellation = true;
        }

        FolderBrowserDialog Folder = new FolderBrowserDialog();
        Stopwatch stopwatch = new Stopwatch();
        static List<string> lstFilesFound = new List<string>();

        int fileCount;
        int fileCount1;
        //string test;

        private void Form1_Load(object sender, EventArgs e)
        {
            //label2.Text = Environment.ProcessorCount.ToString();
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {

        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            DialogResult result = Folder.ShowDialog();
            textBox2.Text = Folder.SelectedPath.ToString();
        }

        private void IdetiIListbox()
        {
            foreach (string n in lstFilesFound.ToList())
            {
                stopwatch.Start();
                if (Path.GetFileName(n).Contains(textBox1.Text.ToString()))
                {
                    this.BeginInvoke(new MethodInvoker(() =>
                    {
                        listBox1.Items.Add(n);
                        //progressBar1.Value++;
                    }));
                }
            }
            stopwatch.Stop();

            int paieska = listBox1.Items.Count;

            this.BeginInvoke(new MethodInvoker(() =>
                    {
                        textBox3.Text = Convert.ToString(stopwatch.Elapsed);
                    }));
        }

        public void Ieskoti1()
        {
            foreach (string ff in Directory.EnumerateFiles(textBox2.Text.ToString(), "*.*"))
            {// Paima failus is pirmo katalogo
                lstFilesFound.Add(ff);
                fileCount1 = lstFilesFound.Count();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (backgroundWorker1.IsBusy != true)
            {
                backgroundWorker1.RunWorkerAsync(textBox2.Text.ToString());
            }
        }

        static void DirSearch(string sDir)
        {
           foreach (string d in Directory.EnumerateDirectories(sDir))
            {
                try
                {
                    lstFilesFound.Add(d);
                    //visoFailu += 1;
                    foreach  (string f in Directory.EnumerateFiles(d, "*.*"))
                    {
                        //visoFailu += 1;

                        lstFilesFound.Add(f);
                    }
                    DirSearch(d);
                }
                catch (Exception ee)
                {

                }
                continue;
            }
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            label4.Text = (e.ProgressPercentage.ToString() + "%");

            progressBar1.Value = e.ProgressPercentage;
        }
        private void backgroundWorker1_DoWork_1(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker worker = sender as BackgroundWorker;
            //DirSearch(textBox2.Text.ToString());

            Ieskoti1();

            DirSearch(textBox2.Text.ToString());
           // IdetiIListbox();

            for (int i = 0; i <= 100; i++)
            {
                backgroundWorker1.ReportProgress(i);
                System.Threading.Thread.Sleep(100);
            }
        }
        private void backgroundWorker1_RunWorkerCompleted_1(object sender, RunWorkerCompletedEventArgs e)
        {
            //DirSearch(textBox2.Text.ToString());
            IdetiIListbox();
            if (e.Cancelled == true)
            {
                MessageBox.Show("Cancelled!");
            }
            else if (e.Error != null)
            {
                MessageBox.Show("Error: " + e.Error.Message);
            }
            else
            {
                MessageBox.Show("Done!");
            }
        }

        private void textBox2_TextChanged(object sender, EventArgs e)
        {
            fileCount = Directory.GetFiles(textBox2.Text.ToString()).Length;
        }
    }
}

0 个答案:

没有答案