これは、これを実現する方法の例です(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;
}
}
'Thread.Sleep'はUIスレッドをブロックしているため、更新できません。代わりに 'Task.Delay'を待って、あなたのコードをasync/awaitにしてください。 – juharr
試してみてください:backgroundworker –