这是我在本网站上找到的修改后的代码。
当向TextBox附加文本并且InvoveRequired为false时,文本将显示在框中,但是下次调用该函数并且InvokeRequired为true时,第一次调用所放置的文本字符串将丢失(“”)。当InvokeRequired为true时多次调用按预期工作。
comBox是一个类型为Textline且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);
}
答案 0 :(得分:2)
这看起来应该可行,也许它与并发有一些关系
尝试使用comBox.Invoke(...)
代替comBox.BeginInvoke(...)
更新: 当您使用 BeginInvoke
时,可能无法调用方法调用。
这是错误的,对Invoke
和BeginInvoke
的调用按顺序执行。
修改强>
它不起作用确保您没有任何其他地方可以更改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);
}
}
<强> EDIT2:强>
如果问题仍然存在,您可以为TextChanged
事件添加事件处理程序,并在文本框被清除时在其中放置断点。
在comBox上添加此方法和TextChanged
的事件处理程序:
private void comBox_TextChanged(object sender, EventArgs e)
{
if (comBox.TextLength == 0)
{
// Set a breakpoint here.
Trace.WriteLine("TextBox empty");
}
}