函数调用线程

时间:2014-01-07 14:21:31

标签: c# multithreading invoke

我是C#的初学者,

开始一个新的线程

pollprintthread = new System.Threading.Thread(PollPrint);
pollprintthread.Start();

在此线程中我使用Datagridview调用函数

void PollPrint()
{
    (some code)
    printausfueren();
    (some code)
}

public void printausfueren()
{
    (some Code)
    object[] row = { sqlReader[0], sqlReader[1], sqlReader[3], sqlReader[2], sqlReader[4], sqlReader[5], sqlReader[6], sqlReader[7] };
    dataGridViewPrint.Rows.Add(row);
    (some Code)
}

但是我不能使用printausfuheren()。invoke,我找到了任何教程但只有静态方法

请帮助:)

2 个答案:

答案 0 :(得分:2)

您可以在此处找到一个很好的解释:https://stackoverflow.com/a/12179408/67038

但是,我建议您在方法中包含对dataGridViewPrint.Rows.Add的调用,并调用该方法。

您需要执行此操作,因为在添加这些行时,您可能希望在UI上执行其他操作。

例如,如果要添加大量行,则需要在网格上调用BeginEdit / EndEdit,以便它不会尝试为您添加的每一行重绘自身:

public void printausfueren()
{
    //(some Code)
    object[] rows = { sqlReader[0], sqlReader[1], sqlReader[3], sqlReader[2], sqlReader[4], sqlReader[5], sqlReader[6], sqlReader[7] };
    dataGridViewPrint.Invoke(new Action(() => LoadGrid(rows)));
    //(some Code)
}

private void LoadGrid(object[] rows)
{
    // only need BeginEdit/EndEdit if you are adding many rows at a time
    dataGridViewPrint.BeginEdit(false);
    dataGridViewPrint.Rows.Add(rows);
    dataGridViewPrint.EndEdit();
}

答案 1 :(得分:0)

您可以轻松使用匿名方法执行复杂的调用,例如:

yourForm.Invoke( (MethodInvoker) delegate() { dataGridViewPrint.Rows.Add(row); } );

这将自动神奇地捕获row实例等。