BackgroundWorker для выполнения задачи

namespace CrypteNode
{
    public partial class Form1 : Form
    {
        private string pathFile;

        public Form1()
        {
            InitializeComponent();
        }

        private void CoderButton_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "Всё файлы (*.*) |*.*| Файлы Shirase (*.shirase)|*.shirase";
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                pathFile = openFileDialog.FileName;
                OpenFile.Text = pathFile.ToString();

                DisplayFile(pathFile);
            }
        }

        // функция DisplayFile.
        // Она разбивает файл на байты и дает нам на них посмотреть.
        void DisplayFile(string strfile)  
        {
            int nCols = 16;
            FileStream fs = new FileStream(strfile, FileMode.Open, FileAccess.Read);
            long nBytesRead = fs.Length;
            if (nBytesRead > 65536 / 4)
                nBytesRead = 65536 / 4;
            int nLines = (int)(nBytesRead / nCols) + 1;
            string[] lines = new string[nLines];
            int nBytesToRead = 0;

            //for (int i = 0; i < bytesAsInts.Length; i++)

            for (int i = 0; i < nLines; i++)
            {
                StringBuilder nextLine = new StringBuilder();
                nextLine.Capacity = 2 * nCols;

                for (int j = 0; j < nLines; j++)
                {
                    int nextByte = fs.ReadByte();
                    nBytesToRead++;
                    if (nextByte < 0 || nBytesToRead > 65536)
                        break;
                    char nextChar = (char)nextByte;
                    nextLine.Append(" 0x0" + string.Format("{0,1:X}", (int)nextChar));
                    //nextLine.Append((int)nextChar);

                }
                lines[i] = nextLine.ToString();
            }

            fs.Close();

            string text = "";
            foreach (string l in lines)
                text += l;

            OutputText.Text = text;
        }
        // Здесь все просто, читаем файл и просматриваем его в байтах и выводим на экран в отдельном окне.
        // Далее, начнем с реализацией функций HEX.На кнопке "шифрования" обработчик с вызова функции Копировать.
        // Она у нас будет основной.
        private void CoderButton_Copy_Click(object sender, EventArgs e)
        {
            Copy(pathFile, OpenFile.Text + ".shirase", false);

        }
        private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {

        }
        // Теперь собственным разберем функцию Копиювати.Якщо ей нужно быстро кодировать файл быстро и красиво.
        public void Copy(string inputFilePath, string outputFilePath, bool CoderMode)
        {
            int bufferSize = 1024 * 64;

            using (FileStream inStream = new FileStream(inputFilePath, FileMode.Open, FileAccess.Read))
            {

                using (FileStream fileStream = new FileStream(outputFilePath, FileMode.OpenOrCreate, FileAccess.Write))
                {

                    int bytesRead = -1;
                    byte[] bytes = new byte[bufferSize];
                    string decodeString = key1.Text;

                    // входной параметр bool -именно он определяет, что будет: кодирование или декодирование.
                    // Создаем просторный буфер, создаем классическую обертку FileStream.Read ==> FileStream.Write
                    // Первая у нас открывает исходный файл, вторая будет сохранять результат в новый файл.
                    // Готовим массив байтов на bufferSize.Для кодирования HEX используется 18 - символьный ключ.                    if (decodeString.Count() < 18)
                    {
                        MessageBox.Show("Довжина цифрового ключа повинна бути 18 символiв");
                        return;

                    }

                    if (!char.IsDigit(key1.Text, 0))
                    {

                        MessageBox.Show("тільки числа");
                        return;
                    }

                    double decodeInt = Convert.ToDouble(decodeString);
                    int ln = (int)(Math.Log(Math.Log(decodeInt, 2)));
                    while ((bytesRead = inStream.Read(bytes, 0, bufferSize)) > 0)
                    {

                        int[] bytesAsInts = bytes.Select(x => (int)x).ToArray();

                        if (CoderMode == false)
                        {

                            for (int i = 0; i < bytesAsInts.Length; i++)
                            {
                                bytesAsInts[i] = ((bytesAsInts[i] - (ln * 2) - 128) * -1);
                            }
                        }

                        // прочитали по-байт файла, перекодировали ASCII-код в integer
                        // используя конструкцию bytes.Select.ToArray, с помощью bool CoderMode задали режим кодирования.

                        // затем с каждым int из массива bytesAsInts произвели математическое преобразование используя пару констант и натуральный логарифм.
                        // Умножение на "минус единицу" сделано, чтобы результат всегда был положительный.

                        // Функция, реализующая обратный процесс:
                        else
                        {
                            for (int i = 0; i < bytesAsInts.Length; i++)
                            {
                                bytesAsInts[i] = ((bytesAsInts[i] * (-1) + ln * 2) + 128);
                            }
                        }

                        byte[] bytes1 = bytesAsInts.Select(x => (byte)x).ToArray();
                        fileStream.Write(bytes1, 0, bytesRead);
                        fileStream.Flush();
                    }

                    fileStream.Close();
                }
            }
        }

        private void CoderButton_Copy1_Click(object sender, EventArgs e)
        {
            // расшифровки с изменением байтов
            string newPathFile = pathFile.Replace(".shirase", "");
            Copy(pathFile, newPathFile, true);

        }

        private void progressBarEncrypting_Click(object sender, EventArgs e)
        {

        }
        private void backgroundWorker_ProgressChanged(object sender,
       System.ComponentModel.ProgressChangedEventArgs e)
        {
            progressBarEncrypting.Value = e.ProgressPercentage;
            int indexer = labelProgress.Text.LastIndexOf(" -");
            if (indexer != -1)
            {
                labelProgress.Text = labelProgress.Text.Substring(0, indexer);
            }
            labelProgress.Text += $" - {e.ProgressPercentage}%";
        }
        private void Form1_Load(object sender, EventArgs e)
        {

        }

        private void key1_TextChanged(object sender, EventArgs e)
        {
            key1.MaxLength = 18;

        }

        private void buttonStopEncryption_Click(object sender, EventArgs e)
        {
            if (backgroundWorker.IsBusy)
            {
                backgroundWorker.CancelAsync();
            }
        }
    }
}
  • private void CoderButton_Click - открыть файл private void
  • CoderButton_Copy_Click - кодировка private void
  • CoderButton_Copy1_Click - раскодировка private void
  • buttonStopEncryption_Click - стоп private void
  • progressBarEncrypting_Click - прогрес бар

Необходимо предотвратить «подвисания» окна при осуществлении шифрования (шифрование должно осуществляться в отдельном вычислительном потоке с помощью класса BackgroundWorker)

Как мне это реализовать, что-то никак не могу приклеить BackgroundWorker и прогрес бар


Ответы (0 шт):