2016-12-05 5 views
0

Visual C#プロジェクトでは、システム応答が表示されるTextBoxがあります。同時に文字列全体ではなく文字を1つずつ追加して表示したいと考えています。私はある種の錯覚を作りたいと思っています。今のWindowsフォーム表示文字列

私が持っている:

for (int i = 0; i <= response.Length; i++) 
{ 
    textBox2.Text = response.Substring(0, i); 
    Thread.Sleep(100); 
} 

しかし、この1は全体の一定時間待機して、文字列全体を提供します。

私は間違っていますか?

+4

'Thread.Sleep'はUIスレッドをブロックしているため、更新できません。代わりに 'Task.Delay'を待って、あなたのコードをasync/awaitにしてください。 – juharr

+0

試してみてください:backgroundworker –

答えて

3

使用非同期:

for (int i = 0; i <= response.Length; i++) 
{ 
    textBox2.Text = response.Substring(0, i); 
    await Task.Delay(100); 
} 

はスコープにasyncキーワードを追加することを忘れないでください。

1

これは、これを実現する方法の例です(WPFで書かれています)。 winformsに簡単に採用することができます。

var form = new Window(); 
var tb = new TextBox(); 

form.Content = tb; 
form.Show(); 

var str = "alk;lfkdsfj;slfhjs;idjhf;lksdjf;klsdjf;'lkjds;lfksd"; 
Task.Run(() => 
{ 
    foreach (var c in str.ToCharArray()) 
    { 
     Thread.Sleep(100); 
     form.Dispatcher.Invoke(() => 
     { 
      tb.Text += c; 
     }); 
    } 
}); 

UPD。 Windowsフォームでは、非同期/待機の回答が難しく複雑になる可能性があります。しかし、いずれにせよ、私は非同期のものなしでこれを行う方法を示すことができる

void Main() 
{ 
    var form = new MyForm();  
    form.Show();  
} 

class MyForm : Form 
{ 
    private TextBox tb; 

    public MyForm() 
    { 
     tb = new TextBox(); 
     tb.Width = 300; 
     this.Controls.Add(tb); 


     var btn = new Button(); 
     btn.Text = "go"; 
     btn.Width = 300;   
     btn.Location = new System.Drawing.Point(0, 50); 
     this.Controls.Add(btn); 

     btn.Click += (sender, args) => 
     { 
      tb.Text = string.Empty; 
      var str = "alk;lfkdsfj;slfhjs;idjhf;lksdjf;klsdjf;'lkjds;lfksd"; 
      SetText d = SetTextToTb; 
      Task.Run(() => 
      { 
       foreach (var c in str.ToCharArray()) 
       { 
        Thread.Sleep(100); 
        tb.Invoke(d, c); 
       } 
      }); 
     }; 
    } 

    public delegate void SetText(char text); 
    void SetTextToTb(char text) 
    { 
     tb.Text += text; 
    } 
} 
+0

winformsのためのform.Dispatcher.Invokeのアナログはありますか? – Coffee

+0

@YawningMilk updated answer – tym32167