Vinodh Muthusamy Ответов: 1

Progressbarusing делегаты в C#


iam работает с прогресс-баром в приложении c# windows, после чтения файла из текста iam добавляется в текстовое поле, но прогресс-бар не работает должным образом, прогресс-бар остается в том же положении, и код получает выполнение, пожалуйста, решите эту проблему.

я делаю эту операцию при выборе ячейки в gridview_cellclick


public static Thread thread1;
        public string strSelectedfile;

        private void GridView_integration_CellClick(object sender, GridViewCellEventArgs e)
        {
            try
            {
                if (e.RowIndex != -1 && e.ColumnIndex != -1)
                {
                    strSelectedfile = Application.StartupPath + "\\" + GridView.Rows[e.RowIndex].Cells[0].Value.ToString();
                    txtReadfile.Text = string.Empty;
                    progressBar.Visible = true;
                    progressBar.Style = ProgressBarStyle.Marquee;
                    thread1 = new Thread(new ThreadStart(loadTextfile));
                    thread1.Start();
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); }
        }
        private void loadTextfile()
        {
            setTextSource(strSelectedfile);
        }
        internal delegate void SetDelegate(string textvalue);

        private void setTextSource(string textvalue)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new SetDelegate(setTextSource), textvalue);
            }
            else
            {
                txtReadfile.Text = File.ReadAllText(textvalue);
                thread1.Abort();
                progressBar.Visible = false;
            }
        }


Что я уже пробовал:

public static Thread thread1;
        public string strSelectedfile;

        private void GridView_integration_CellClick(object sender, GridViewCellEventArgs e)
        {
            try
            {
                if (e.RowIndex != -1 && e.ColumnIndex != -1)
                {
                    strSelectedfile = Application.StartupPath + "\\" + GridView.Rows[e.RowIndex].Cells[0].Value.ToString();
                    txtReadfile.Text = string.Empty;
                    progressBar.Visible = true;
                    progressBar.Style = ProgressBarStyle.Marquee;
                    thread1 = new Thread(new ThreadStart(loadTextfile));
                    thread1.Start();
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message.ToString()); }
        }
        private void loadTextfile()
        {
            setTextSource(strSelectedfile);
        }
        internal delegate void SetDelegate(string textvalue);

        private void setTextSource(string textvalue)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new SetDelegate(setTextSource), textvalue);
            }
            else
            {
                txtReadfile.Text = File.ReadAllText(textvalue);
                thread1.Abort();
                progressBar.Visible = false;
            }
        }

1 Ответов

Рейтинг:
0

OriginalGriff

Потому что именно это делает Invoke: он перемещает код обратно в поток пользовательского интерфейса. Это означает, что поток пользовательского интерфейса снова занят чтением содержимого файла и не может обновить какой - либо индикатор выполнения, пока он не будет завершен.

Если вы хотите прочитать файл и одновременно показать индикатор выполнения, я бы предложил использовать BackgroundWorker, который имеет встроенный механизм отчетов о ходе выполнения для обновления вашего индикатора выполнения (он выполняется в потоке пользовательского интерфейса, поэтому вам не нужно его вызывать). В вашем обработчике DoWork для потока считывайте файл по частям и сообщайте о новом прогрессе каждые 10% или около того, чтобы обновить панель. ReadAllText-это "монолитная" операция, которая не возвращается до тех пор, пока не будет завершен весь файл, поэтому прогресс не может быть показан до тех пор, пока не будет завершено все чтение.


Vinodh Muthusamy

Я приму ваше решение, у вас есть какой-нибудь пример его кода

OriginalGriff

Документация Microsoft включает в себя пример кода:
https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker(v=против 110).aspx