在Windows窗体应用程序后台工作

Kla*_*ner -1 c# backgroundworker winforms

我有以下星座:

MainForm.cs->包括我所有的表单元素

Program.cs->包括主体部分,它是一个xmlreader / writer,用于更改xml文件中的xml属性,该文件的大小可以达到4gb

所以这个小应用程序工作,但当然UI变得反应迟钝和冻结,我想避免的,我也希望能减少对道路这一过程的持续时间

我从BtnClick事件开始调用xmlread / write方法:

    void BtnApplyChangesClick(object sender, EventArgs e)
    {
        Program p = Program.Instance;
        pbApplyChanges.Minimum = 0;
        pbApplyChanges.Step = 1;

        Cursor.Current = Cursors.WaitCursor;
        foreach(DataGridViewRow cr in dataGridView2.Rows)
        {
            pbApplyChanges.Maximum = dataGridView2.Rows.Count;
            p.changeElements(cr.Cells["Filename"].Value.ToString(), txtTenant.Text, txtDate.Text, txtEvtId2.Text);
            pbApplyChanges.PerformStep();
        }
        Cursor.Current = Cursors.Arrow;
        MessageBox.Show("Job done");
    }
Run Code Online (Sandbox Code Playgroud)

在呼叫我用的Program.cs和我的主要方法有我的单一实例(changeElements)使用4字符串参数,可以说都是从信息的表格上当受骗!(我想这是有点不好的做法,但它迄今的工作...)

当我尝试用backgroundWorker替换此方法调用时(它自己进行了方法调用),我失败了,因为甚至没有进行方法调用...我发现无法从BW线程访问UI元素,因此我想这也是不工作我的方法调用的原因?

那么,如何能得到这个星座的工作?我是否必须将所有4个字符串参数和(Program.cs的)类实例传递给后台工作人员?是BW即使是工作的最佳工具?

Seb*_*ebi 5

通常,BackgroundWorker不应访问任何UI元素。Winforms中的一个古老建议是,应该仅从UI线程访问UI元素。

您可以像这样使用Background-Worker:

private void Main(string[] args)
{
    BackgroundWorker bw = new BackgroundWorker();
    bw.DoWork += Bw_DoWork;
    bw.RunWorkerCompleted += Bw_RunWorkerCompleted;

    //Parameter you need to work in Background-Thread for example your strings
    string[] param = new[] {"Text1", "Text2", "Text3", "Text4"};

    //Start work
    bw.RunWorkerAsync(param);
}

//Do your Background-Work
private void Bw_DoWork(object sender, DoWorkEventArgs e)
{
    string[] param = e.Argument as string[];

    //Process your long running  task

    e.Result = null; //Set your Result of the long running task
}

//Taking your results
private void Bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    //Apply your Results to your GUI-Elements
    myTextBox1.Text = e.Result.ToString();
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,Background-Worker是一些老派的东西,所以如果您想学习新的东西,请在这里查看,并向您介绍TPL。这给你一个更好地处理异步的。

实际上,我认为将4gb数据存储在XML文件中并不是很好。您是否考虑数据库?还是将XML文件拆分为许多XML文件?因此,您将能够分块读取数据。

我希望这可以帮助你。