【问题标题】:TextBox loses text when InvokeRequired == false当 InvokeRequired == false 时,TextBox 会丢失文本
【发布时间】:2010-05-20 06:14:34
【问题描述】:

这是我在这个网站上找到的修改后的代码。

当向 TextBox 追加文本且 InvoveRequired 为 false 时,文本将显示在框中,但下次调用该函数且 InvokeRequired 为 true 时,第一次调用放置的文本字符串将丢失 ("")。当 InvokeRequired 为 true 时,多次调用按预期工作。

comBox 是一个 TextBox 类型,multline = true。

任何帮助将不胜感激。

 public void LogComText(string comText, bool newline)
    {
        if (comBox.InvokeRequired)
        {

            comBox.BeginInvoke(new Action(delegate
            {
                LogComText(comText, newline);
            }));
            return;
        }
        comBox.AppendText(comText);
        if (newline) comBox.AppendText(Environment.NewLine);


    }

【问题讨论】:

  • 这太令人惊讶了...您能否创建一个简短但完整的程序来演示该问题?
  • 我肯定会说,在你的程序中的其他地方你会做一个combBox.Text = "" 或类似的东西。

标签: c# winforms


【解决方案1】:

这看起来应该可以工作,也许它与并发有关。
尝试使用 comBox.Invoke(...) 而不是 comBox.BeginInvoke(...)
更新: 问题是当您使用 BeginInvoke 时,方法调用可能会乱序调用。
这是错误的,对InvokeBeginInvoke 的调用是按顺序执行的。

编辑:
它不起作用确保您没有任何其他地方可以更改comBox 中的文本。

如果它仍然不起作用,您可能需要创建一个锁以确保您没有两个线程同时写入文本框。

类似这样的:

private static readonly object _comBoxSyncObj = new object();
public void LogComText(string comText, bool newline)
{
    if (comBox.InvokeRequired)
    {
        comBox.Invoke(new Action(delegate
        {
            LogComText(comText, newline);
        }));
        return;
    }
    lock (_comBoxSyncObj)
    {
        comBox.AppendText(comText);
        if(newline) comBox.AppendText(Environment.NewLine);
    }
}

编辑2:
如果问题仍然存在,您可以为TextChanged 事件添加一个事件处理程序,并在其中设置一个断点以确保文本框被清除。

在 comBox 上为TextChanged 添加此方法和事件处理程序:

private void comBox_TextChanged(object sender, EventArgs e)
{
    if (comBox.TextLength == 0)
    {
        // Set a breakpoint here.
        Trace.WriteLine("TextBox empty");
    }
}

【讨论】:

  • Invoke 和 beginInvoke 的结果相同。我会尝试锁定并回帖。
  • Control.BeginInvoke, "在创建控件的基础句柄的线程上异步执行委托。" BeginInvoke 只是将一条消息添加到 UI 线程的队列中。这些消息将按照它们创建的顺序进行处理。
  • @hemp,你说得对。我想到了ThreadPool.QueueUserWorkItem
猜你喜欢
  • 2023-03-12
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多