我不认为以下问题很少见。但由于我不知道如何寻找正确的答案,所以我仍然坚持下去。
我在表单中有一个标签,我想同时显示一些单词
public string[] words = new string[]{"add", "ado", "age", "ago", "aid", "ail", "aim", "air", "and", "any", "ape", "apt", "arc", "are", "ark", "arm",
"art", "ash", "ask", "auk", "awe", "awl", "aye", "bad", "bag", "ban", "bat", "bee", "boa", "ear", "eel", "eft",
"far", "fat", "fit", "lee", "oaf", "rat", "tar", "tie"};
private async void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i <= 39; i++)
{
label1.Text = words[i];
Thread.Sleep(100);
}
}
标签只显示&#34; eft&#34; &#34; for&#34;之前不会显示任何内容已经完成了。
答案 0 :(得分:3)
理想情况下,您应该使用System.Windows.Forms.Timer进行更新 - 否则您将阻止主线程。但是,您可以调用Form.Refresh来强制循环更新。
答案 1 :(得分:1)
您可以使用不会阻止UI线程的Task.Delay
:
private async void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
for (var i = 0; i <= 100; i++)
{
((Button) sender).Content = i.ToString();
await Task.Delay(100);
}
}
使用此解决方案不需要创建任何额外的线程,因此它应该更有效。
答案 2 :(得分:0)
试试这个
private async void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 100; i++)
{
label1.Text = i.ToString();
await Task.Run(() => { Thread.Sleep(100); });
}
}
答案 3 :(得分:0)
这将有效
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i <= 100; i++)
{
Application.DoEvents();
label1.Text = i.ToString();
Thread.Sleep(100);
}
}
在您的代码中调用 Application.DoEvents(),以便您的应用可以处理其他事件
答案 4 :(得分:0)
您可以使用System.Threading.Timer
:
System.Threading.Timer timer;
int i=-1;
public string[] words = new string[]{"add", "ado", "age", "ago", "aid", "ail", "aim", "air", "and", "any", "ape", "apt", "arc", "are", "ark", "arm",
"art", "ash", "ask", "auk", "awe", "awl", "aye", "bad", "bag", "ban", "bat", "bee", "boa", "ear", "eel", "eft",
"far", "fat", "fit", "lee", "oaf", "rat", "tar", "tie"};
private async void button1_Click(object sender, EventArgs e)
{
timer = new System.Threading.Timer(timer_Tick, null, 0, 100); //Time delay 100
}
private void timer_Tick(Object state)
{
try
{
i++;
this.Invoke((MethodInvoker)delegate
{
label1.Text = words[i];
if (i==words.Length )
timer.Change(Timeout.Infinite, Timeout.Infinite);
});
}
catch (Exception ex)
{
}
finally
{
}
}
答案 5 :(得分:0)
ThreadStart safir ;
Thread Nakh;
delegate void kar(string p);
private void button1_Click(object sender, EventArgs e)
{
safir = new ThreadStart(NeveshtanDarBarchasb);
Nakh = Thread(safir);
Nakh.Start();
}
public void NeveshtanDarBarchasb()
{
for (int i = 0; i <= 39; i++)
{
Benevis(I.ToString());
Thread.Sleep(100);
}
}
public void Benevis(string p)
{
if( lbl.InvokeRequired)
{
kar k= new kar(Benevis);
Invoke(k,new object[]{p};
}
else
{
label1.Text = p;
}
}