【问题标题】:Function Invoke Thread函数调用线程
【发布时间】:2014-01-07 14:21:31
【问题描述】:

我是 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,我找到了任何教程,但仅适用于静态方法

请帮忙:)

【问题讨论】:

  • 这是什么 UI 框架? Windows 窗体?
  • printausfueren 在工作线程上执行,您正在访问其中的 UI 元素。
  • 是的,它的 Windows 窗体。
  • @terrybozzio,这就是问题所在,我如何在主线程中执行 printausfueren?

标签: c# multithreading invoke


【解决方案1】:

你可以在这里找到一个很好的解释: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();
}

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 这段代码不会编译(我希望它会)。您会得到:“无法将 lambda 表达式转换为类型 'System.Delegate',因为它不是委托类型”。不幸的是,您必须使语法更不稳定:stackoverflow.com/a/2367763/67038
    • @JMarsch 我已经更新了最简单有效的答案:)
    猜你喜欢
    • 2015-11-14
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多