C # winform индикатор выполнения не обновляется во время работы в событии do_work - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть простое приложение для создания выигрышных форм, и я хочу отображать индикатор выполнения во время загрузки данных из базы данных в виде сетки. В индикаторе выполнения моего проекта завершено после того, как обработка была завершена или прогресс не отображается вообщеЭто мой код.

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    ADTNEWEntities db = new ADTNEWEntities();
    private delegate void MyDeligate();
    private void myFunction()
    {
        dataGridView1.DataSource = db.CashPays.ToList();
    }
    private void backgroundWorker1_DoWork(object sender,DoWorkEventArgs e)
    {
        this.Invoke(new updateProgressDelegate(updateProgressBar));
        //call your code here
        Invoke(new MyDeligate(myFunction));
    }
       private void backgroundWorker1_RunWorkerCompleted(object sender,        RunWorkerCompletedEventArgs e)
    {
        progressBar1.Visible = false;
    }
 private void button1_Click(object sender, EventArgs e)
    {
        if (!backgroundWorker.IsBusy)
            backgroundWorker.RunWorkerAsync();
    }
    BackgroundWorker backgroundWorker;
    private void Form1_Load(object sender, EventArgs e)
    {
        backgroundWorker = new BackgroundWorker();
        progressBar1.Visible = false;
        progressBar1.Style = ProgressBarStyle.Marquee;
        backgroundWorker.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        backgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
  }
    private delegate void updateProgressDelegate();

    private void updateProgressBar()
    {
        progressBar1.Visible = true;
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Update();
    }
}

1 Ответ

0 голосов
/ 19 декабря 2018

Вы должны заменить все этого кода на:

private async void button1_Click(object sender, EventArgs e)
{
    progressBar1.Visible=false;
    var data=await db.CashPays.ToListAsync();
    dataGridView1.DataSource = data;
    progressBar1.Visible=true;
}

private void Form1_Load(object sender, EventArgs e)
{
    progressBar1.Visible = false;
    progressBar1.Style = ProgressBarStyle.Marquee;
}

Нет смысла использовать (сейчас устаревшие) BGW или Task.Run, когда работа, которую они должны сделать должен работать на интерфейсе пользователя.Установка DataSource является операцией пользовательского интерфейса.Однако загрузка данных может выполняться в фоновом режиме с помощью ToListAsync () или ToArrayAsync ()

ToListAsync() не предоставляет никаких событий прогресса, поэтому прогрессБар должен использовать Marquee стиль

...