【问题标题】:C# Invoke Failing on Thread FunctionC#调用线程函数失败
【发布时间】:2012-07-17 19:53:11
【问题描述】:

我正在使用计时器定期读入日志文件并将某些内容发布到我正在使用 C# 开发的 Windows 窗体应用程序中的文本框中。为此,我向 set_textbox_thread 发送一个字符串,该字符串将文本发布到下面 else 中的相应文本框 (tbc)。下面的代码适用于我构建的练习应用程序。但是,相同的代码运行,但无法在我正在构建的完整应用程序中更新我的文本框。 Invoke 语句似乎失败了,该语句无法再次调用 set_textbox_thread。我的理论是,因为我的完整应用程序有一组更复杂的控件,所以我没有通过正确的控件调用 Invoke。我尝试通过“this”父面板、父表单和触发 set_textbox_thread 的按钮来调用它,并且正在处理相同的结果。两个问题:

  1. 我应该在哪个控件下调用 Invoke?
  2. 有没有办法检索“拥有底层窗口句柄的控件的线程?我可以通过 Controls.Owner 方法来做到这一点吗?
  3. 我已尝试使用 try/catch 进行此 Invoke 调用,但无法在 catch 中检索错误消息。任何想法如何以这种方式解决问题?

提前致谢!

private delegate void stringDelegate(string s);        
private void set_textbox_thread(string s)
    {
        TextBox tbc = get_thread_tb();

        if (tbc.InvokeRequired)
        {
            MessageBox.Show("Invoke Required");
            stringDelegate sd = new stringDelegate(set_textbox_thread);
            **this.Invoke(sd, new object[] {s });**
            MessageBox.Show("Invoke Completed");
        }
        else
        {

【问题讨论】:

  • set_textbox_thread 包含在什么类中?表格?
  • set_textbox_thread 的其余部分是做什么的?你只发布了一半的代码......
  • 您没有展示任何可以工作的东西(即没有实际更新文本框的东西)。真的很难告诉你如何解决它......
  • 看起来您在上面发布的代码缺少一些部分。

标签: c# multithreading inheritance invoke


【解决方案1】:

1) 调用什么控件并不重要;只有一个 UI 线程和任何控件可以将调用封送回该 UI 线程。

2) 你可以用这个线程做什么?

3) 没有太多细节。你怎么知道你有错误信息? “错误消息”是什么意思

【讨论】:

    【解决方案2】:

    改为在文本框上调用 invoke:

    tbc.Invoke(sd, new object[] {s });
    

    【讨论】:

      猜你喜欢
      • 2020-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多