Фоновый рабочий не запускается - PullRequest
1 голос
/ 13 февраля 2020

Я реализовал фоновый рабочий на загрузке моего окна. Код в Progress_Load достигнут, но после этого функция DoWork не вызывается. Функция excel.Read () считывает довольно большой список Excel в список, это занимает около 1,5 минут, и поэтому я хочу сделать это a-syn.

public List<Part> partList = new List<Part>() { };
//boolean that will be set when the backgroundworker is done
public bool listRead = false;

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    _Excel excel = new _Excel();
    partList = excel.Read();
    backgroundWorker1.ReportProgress(100);
}

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    Message m;
    if (e.Cancelled == true)
    {
        m = new Message("The operation has been canceld!", "Canceled");
        this.Close();
    }
    else if (e.Error != null)
    {
        Error er = new Error("Error: " + e.Error.Message, "Error!");
        this.Close();
    }
    else
    {
        listRead = true;
    }
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    //Change the value of the ProgressBar to the BackgroundWorker progress.
    progressBar1.Value = e.ProgressPercentage;
    //Set the text.
    this.Text = e.ProgressPercentage.ToString();
}

private void Progress_Load(object sender, EventArgs e)
{

    if (backgroundWorker1 == null)
    {
        backgroundWorker1 = new BackgroundWorker();
        backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
        backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
        backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
    }
    backgroundWorker1.WorkerReportsProgress = true;
    backgroundWorker1.WorkerSupportsCancellation = true;
    backgroundWorker1.RunWorkerAsync();
}

1 Ответ

1 голос
/ 13 февраля 2020

Вероятно, это не ноль при загрузке формы. Возможно, вы добавили BackgroundWorker через дизайнер. Если это так, оно никогда не равно нулю, вы можете подключить обработчики событий также из его свойств / событий.

Попробуйте это

private void Progress_Load(object sender, EventArgs e)
{

    if (backgroundWorker1 == null)
    {
        backgroundWorker1 = new BackgroundWorker();
    }

    backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
    backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
    backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);

    backgroundWorker1.WorkerReportsProgress = true;
    backgroundWorker1.WorkerSupportsCancellation = true;
    backgroundWorker1.RunWorkerAsync();
}

В WPF Dispatcher.BeginInvoke(DispatcherPriority.Background, workAction); - это еще один вариант, так как отчет о ходе выполнения не очень полезно в вашем сценарии. Вот пример сравнения диспетчера и фонового рабочего .

...