2012-07-27 3 views
0

질문 :C#을를 RichTextBox이 기능 플러시가

가 나는하여 RichTextBox에 기능과 같은 높이를 수행 할 수 있습니까?

이유 :

내가 쓰고 있어요 ~ 루프를 사용하여 RichTextBox에 한 번에 텍스트의 20 ~ 40 개 라인, 내 문제는 전체 GUI가 그 시간 동안 정지 아무것도 모든 것을 할 때까지 본 적이 될 수 있다는 것입니다 richtextbox에 쓰여지고 코드가 계속 이동합니다. 나는 가능한 한 얼어 붙지 않도록 가능한 한 화면에 각 줄을 쓰고 싶다. 콘솔에서이 함수를 수행하기 위해 aFileStream.Flush() 명령을 사용할 수 있음을 알고 있습니다. aFileStream.appendtext()와 비슷한 기능이 있습니까? 내 googleFu 오늘 약한이며 나는이 온라인의 모든 예제를 찾을 수 없습니다. 어떤 도움을 주셔서 감사합니다.

샘플 코드 :

foreach (string fullPath in appDataDirectories) 
       { 
        //update progess bar 
        progresbarupdate(); 
        //split file path in to parts 
        string[] folders = fullPath.Split('\\'); 
        //print out create time for directory 
        DateTime creationTimeUtc = Directory.GetCreationTimeUtc(fullPath); 
        String ctime = creationTimeUtc.ToString(); 
        //create String 
        String printable = String.Format("{0,-50}\t{1}", ctime, fullPath); 
        output.AppendText(printable + "\n"); 
       } 

답변

2

나는 그렇게 생각하지 않아요 당신으로하여 RichTextBox의 정지 상태를 해제를 달성 할 수있을 것입니다 플러시 당신은 몇 가지 작업을 수행 할 BackgroundWorker을 사용할 수 있습니다

별도의 스레드에서 배경을 클릭 한 다음 RichTextBox의 텍스트 동작을 호출합니다.

RichTextBox가 고정되지 않는 것을 보여주는 예제를 참조하십시오.

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     BackgroundWorker bg = new BackgroundWorker(); 
     bg.DoWork += new DoWorkEventHandler(bg_DoWork); 
     bg.RunWorkerAsync(); 
    } 

    void bg_DoWork(object sender, DoWorkEventArgs e) 
    { 
     for (int i = 0; i < 1000000000; i++) 
     { 
      Action action =() => richTextBox1.Text += "Line Number " + i; 
      richTextBox1.Invoke(action); 
     } 
    } 
} 
+0

그건 제가 두려웠 던 것입니다. 여러 스레드를 사용하도록 응용 프로그램을 업데이트해야 할 수도 있지만 기존 코드에서 작동하는 다른 솔루션을 기대하고 있습니다. – toosweetnitemare

+0

@toosweetnitemare 다른 트릭이 그것을 할 수도 있지만, 완벽하지는 않지만 스레드를 회전 시켜서이 Thread.SpinWait (100)과 같은 시간 기다려야합니다. 그래서 Ui는 100 스핀에 대해 고정 해제 될 것입니다 – HatSoft

+0

멀티 스레드가 내 유일한 해결책이라고 생각합니다. – toosweetnitemare

1

가장 좋은 방법은이 스레드를 별도의 스레드에서 처리하고 BeginInvoke 메서드를 사용하여 원하는 텍스트를 작성하는 것입니다. 이렇게하면 기본 UI가 응답 성있게 유지되어야합니다.

http://msdn.microsoft.com/en-us/library/0b1bf3y3.aspx

+0

답장을 보내 주셔서 감사합니다. 내 유일한 옵션을 여러 스레드입니까? – toosweetnitemare

+0

늦게 답장을 드려 죄송합니다. 데스크톱 응용 프로그램에서 더 좋은 방법은 없습니다. 그것은 다루기가 너무 어렵지 않아야합니다. – Justin

+0

감사합니다. 이제 스레드를 다시 사용하는 법을 배워야합니다. ive가 그들을 요구할만큼 큰 신청을했기 때문에 거의 10 년이되었습니다. 시간 내 주셔서 감사합니다! – toosweetnitemare