【问题标题】:New line disappears after Invoke调用后新行消失
【发布时间】:2013-07-25 10:16:26
【问题描述】:

我在这里遇到了一个愚蠢的小问题。对于上下文,使用 C#,我在一些套接字之间进行通信,我想显示来自工作线程的输出。

我有这些行来显示输出:

txtOutput.AppendText("Client - Sending the following message: " + Encoding.UTF8.GetString(bytes) + Environment.NewLine);

txtOutput.Invoke(new Action(() =>  txtOutput.AppendText("Client - Server returned a message: " + str + Environment.NewLine)));

第一行是从程序的主线程添加的,第二行是从工作线程添加的。

第一行总是显示得很好,然后第二行也显示得很好。但是当我再次执行序列时,第一行 B 被粘贴到第二行 A 上,第二行 B 再次看起来正确。所以很明显第二行的 NewLine 正在消失,但我真的不明白为什么或如何解决这个问题。

【问题讨论】:

  • 尝试先做一个字符串变量,然后追加字符串,还是一样的问题?
  • 可悲的是,这没什么区别!
  • 我现在正在测试,它可以在没有字节的情况下工作。所以用“字节”编码的东西搞砸了这个upp..

标签: c# newline invoke


【解决方案1】:

你可以试试这个。我认为你的问题是编码。

当您发送消息时:

string message = input(textbox ex);
UTF8Encoding utf8 = new UTF8Encoding();
byte[] encodedbytes = utf8.GetBytes(message);

并在接收时保留您的代码。

我用以下方法对此进行了测试:

public partial class Form1 : Form
{

    private Thread thread;
    private byte[] encodedBytes2;
    private byte[] encodedBytes;
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {

        UTF8Encoding utf8 = new UTF8Encoding();
        string unicodeString = "Quick brown fox";
        encodedBytes = utf8.GetBytes(unicodeString);

        encodedBytes2 = new byte[20];
        encodedBytes2[0] = (byte)'r';
        encodedBytes2[1] = (byte)'e';


        for(int i = 0; i < 5; i++)
            textBox1.AppendText("ENCODED " + Encoding.ASCII.GetString(encodedBytes) + Environment.NewLine);

        for(int i = 0; i < 5; i++)
            textBox1.AppendText(" NOT ENCODED " + Encoding.ASCII.GetString(encodedBytes2) + Environment.NewLine);

        thread = new Thread(ThreadWork);
        thread.IsBackground = true;
        thread.Start();
    }

    private void ThreadWork()
    {

        for (int i = 0; i < 5; i++)
            textBox1.Invoke(new Action(() => textBox1.AppendText("THREAD ENCODED " + Encoding.ASCII.GetString(encodedBytes) + Environment.NewLine)));

        for (int i = 0; i < 5; i++)
            textBox1.Invoke(new Action(() => textBox1.AppendText("THREAD NOT ENCODED " + Encoding.ASCII.GetString(encodedBytes2) + Environment.NewLine)));
    }
}

输出结果显示在多行文本框中:

编码快速棕色狐狸
编码快速棕色狐狸
编码快速棕色狐狸
编码快速棕色狐狸
编码快速棕色狐狸
未编码再未编码再未编码再未编码再未编码再螺纹编码快速棕色狐狸 螺纹编码快速棕色狐狸
螺纹编码快速棕色狐狸
螺纹编码快速棕色狐狸
螺纹编码快速棕色狐狸
未编码的线程 未编码的线程 未编码的线程 未编码的线程 未编码的线程 未编码的线程 未编码的线程

【讨论】:

    猜你喜欢
    • 2014-09-29
    • 2018-06-12
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    相关资源
    最近更新 更多