C# 当invokererequired==false时,TextBox会丢失文本
这是我在这个网站上找到的修改过的代码 当向文本框追加文本且InvoveRequired为false时,文本将显示在框中,但下一次调用函数且InvokeRequired为true时,第一次调用放置的文本字符串将丢失(“”)。InvokeRequired时的多个调用为true,按预期工作 comBox是一个类型文本框,multline=true 任何帮助都将不胜感激C# 当invokererequired==false时,TextBox会丢失文本,c#,winforms,C#,Winforms,这是我在这个网站上找到的修改过的代码 当向文本框追加文本且InvoveRequired为false时,文本将显示在框中,但下一次调用函数且InvokeRequired为true时,第一次调用放置的文本字符串将丢失(“”)。InvokeRequired时的多个调用为true,按预期工作 comBox是一个类型文本框,multline=true 任何帮助都将不胜感激 public void LogComText(string comText, bool newline) {
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);
}
这看起来应该是可行的,可能与并发性有关。
尝试使用
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
事件添加事件处理程序,并在清除文本框时将断点放入se
在comBox上为TextChanged
添加此方法和事件处理程序:
private void comBox_TextChanged(object sender, EventArgs e)
{
if (comBox.TextLength == 0)
{
// Set a breakpoint here.
Trace.WriteLine("TextBox empty");
}
}
真令人惊讶。。。你能创建一个简短但完整的程序来演示这个问题吗?我肯定会说,在你的程序的其他地方,你可以执行
combBox.Text=“
或类似的操作。Invoke和beginInvoke都有相同的结果。我将尝试使用lock和post back.Control.BeginInvoke,“在创建控件底层句柄的线程上异步执行委托。”BeginInvoke只向UI线程的队列中添加一条消息。这些消息将按创建顺序进行处理。@hemp,你说得对。我考虑了线程池.QueueUserWorkItem
。