-3

我正在使用计时器定期读入日志文件并将某些内容发布到我正在用 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
        {
4

2 回答 2

0

1)你调用什么控制并不重要;只有一个 UI 线程和任何控件将调用编组回该 UI 线程。

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

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

于 2012-07-17T19:57:25.833 回答
0

改为在文本框上调用调用:

tbc.Invoke(sd, new object[] {s });
于 2012-07-17T19:57:39.867 回答