后台工作者未启动

问题描述 投票:1回答:1

我已经在窗口的onLoad中实现了一个后台工作程序。到达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();
}
c# wpf backgroundworker
1个回答
1
投票

可能在加载表单时不为null。您可能已经通过设计器添加了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);是另一个选项,因为在您的方案中报告进度不是很有用。 example for Dispatcher and Background worker comparison

© www.soinside.com 2019 - 2024. All rights reserved.