2013-07-25 4 views
1

여기에 사소한 문제가 있습니다. 컨텍스트의 경우 C#을 사용하여 일부 소켓간에 통신 중이며 작업자 스레드의 출력을 표시하려고합니다.Invoke 후 새 줄이 사라짐

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))); 

첫 번째 라인은 프로그램의 메인 스레드, 작업자 스레드로부터 두 번째로 첨가된다

는 I 출력을 표시하는 선이있다.

첫 번째 행은 항상 정상적으로 표시되고 두 번째 행도 정상적으로 표시됩니다. 그러나 시퀀스를 다시 수행하면 첫 번째 줄 B가 두 번째 줄 A에 붙여지며 두 번째 줄 B는 다시 올바르게 보입니다. 그래서 분명히 두 번째 라인의 NewLine은 사라지고 있습니다. 그러나이 문제를 해결하는 이유 또는 방법을 이해하지 못합니다.

+0

문자열 변수를 먼저 만든 다음 문자열을 추가하십시오. 여전히 동일한 문제가 있습니까? – butterbox

+0

슬프게도, 그 차이는 없습니다! – David

+0

지금 테스트 중이며 바이트 없이도 작동합니다. 그래서 "바이트"의 인코딩을 가진 무언가가이 upp를 엉망이게합니다. – butterbox

답변

0

시도해 볼 수 있습니까? 문제가 인코딩이라고 생각합니다.

당신이 메시지를 보내

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))); 
    } 
} 

을 그리고 출력은 여러 줄 텍스트 상자에이 밝혀졌다 : 빠른 갈색 여우
가 인코딩 빠른 갈색 여우
빠른 갈색 여우
인코딩

인코딩 ENCODED 빠른 갈색 여우
짧은 갈색 여우
ENCODED re not ENC 오뎃는 인코딩되지 인코딩되지 다시하지가 인코딩 reTHREAD가 인코딩 빠른 갈색 여우 THREAD가 인코딩 빠른 갈색 여우
THREAD가 인코딩 빠른 갈색 여우
THREAD가 인코딩 빠른 갈색 여우
THREAD가 인코딩 빠른 갈색 여우
THREAD 인코딩되지 reTHREAD 재 인코딩되지 재 reTHREAD 인코딩 안됨 reTHREAD 인코딩 안됨 reTHREAD NOT ENCODED 다시