将参数传递给Backgroundworker

时间:2013-06-15 16:33:13

标签: c# backgroundworker

我正在使用后台工作程序运行c#代码。我通过使用foreach循环并在循环内部传递foreach变量作为Backgroundworker的参数来强迫它。但问题是,每当我只运行代码单个随机值时,很可能Gridview中的最后一行作为参数传递。代码如此

foreach (DataGridViewRow row in dataGridView3.Rows)
{
    BackgroundWorker worker = new BackgroundWorker();
    worker.WorkerSupportsCancellation = true;
    worker.DoWork += delegate
    {
        data = dataGridView3.Rows[row.Index].Cells[0].Value.ToString();
        rowindex = row.Index;
        data1 = ros[0].Cells[0].Value.ToString();
    };

    worker.RunWorkerAync();
}

3 个答案:

答案 0 :(得分:2)

尝试将参数发送为row

worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
    DataGridViewRow  dgr = (DataGridViewRow)args.Argument;
    data = dataGridView3.Rows[dgr.Index].Cells[0].Value.ToString();
    rowindex = dgr.Index;
    data1 = dgr[0].Cells[0].Value.ToString();
};

worker.RunWorkerAsync(row);

答案 1 :(得分:1)

除了@ Damith的回答,你还可以在本地范围内捕获foreach变量。

foreach (DataGridViewRow row in dataGridView3.Rows)
{
    DataGridViewRow copy = row; // captured!
    BackgroundWorker worker = new BackgroundWorker();
    worker.WorkerSupportsCancellation = true;
    worker.DoWork += delegate
    {
        data = dataGridView3.Rows[copy.Index].Cells[0].Value.ToString();
        rowindex = copy.Index;
        data1 = copy[0].Cells[0].Value.ToString();
    };

    worker.RunWorkerAync();
}

这是因为row变量在每次迭代中绑定到不同的值,因此您在最后一次迭代时获得了行的值。

this answer以及Eric Lipperts blog中解释了这一点。

答案 2 :(得分:-1)

看起来像

data = dataGridView3.Rows[row.Index].Cells[0].Value.ToString();

可以修改为:

data = row.Cells[0].Value.ToString();

因为它违背了foreach陈述的全部目的。 此外,以下行似乎也有拼写错误:

data1 = ros[0].Cells[0].Value.ToString();

我不确定您要包含的内容data1,但您可能只想考虑从BackgroundWorker语句中传递DataGridView row foreach变量,然后在DoWork方法中提取必要的数据。