Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当invokererequired==false时,TextBox会丢失文本_C#_Winforms - Fatal编程技术网

C# 当invokererequired==false时,TextBox会丢失文本

C# 当invokererequired==false时,TextBox会丢失文本,c#,winforms,C#,Winforms,这是我在这个网站上找到的修改过的代码 当向文本框追加文本且InvoveRequired为false时,文本将显示在框中,但下一次调用函数且InvokeRequired为true时,第一次调用放置的文本字符串将丢失(“”)。InvokeRequired时的多个调用为true,按预期工作 comBox是一个类型文本框,multline=true 任何帮助都将不胜感激 public void LogComText(string comText, bool newline) {

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

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

comBox是一个类型文本框,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);


    }

这看起来应该是可行的,可能与并发性有关。
尝试使用
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