C# Windows窗体应用程序c中的异步显示#
我认为以下问题并不少见。但由于我不知道如何寻找正确的答案,所以我仍然坚持下去 我在表单中有一个标签,我想同时显示一些单词C# Windows窗体应用程序c中的异步显示#,c#,winforms,asynchronous,count,C#,Winforms,Asynchronous,Count,我认为以下问题并不少见。但由于我不知道如何寻找正确的答案,所以我仍然坚持下去 我在表单中有一个标签,我想同时显示一些单词 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",
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);
}
}
public string[]words=新字符串[]{“add”、“ado”、“age”、“ago”、“aid”、“ail”、“aim”、“air”、“and”、“any”、“ape”、“apt”、“arc”、“are”、“ark”、“arm”,
“艺术”、“灰烬”、“询问”、“海雀”、“敬畏”、“锥子”、“是”、“坏”、“袋子”、“禁令”、“蝙蝠”、“蜜蜂”、“蟒蛇”、“耳朵”、“鳗鱼”、“eft”,
"远,","胖","胖","胖","胖","胖";
私有异步无效按钮1\u单击(对象发送方,事件参数e)
{
对于(int i=0;i理想情况下,您应该使用System.Windows.Forms.Timer进行更新-否则您将阻止主线程。但是,您可以调用Form.Refresh来强制在循环中进行更新。尝试此方法
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); });
}
}
private async void按钮1\u单击(对象发送方,事件参数e)
{
对于(int i=0;i<100;i++)
{
label1.Text=i.ToString();
wait Task.Run(()=>{Thread.Sleep(100);});
}
}
您可以使用不会阻塞UI线程的任务延迟:
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);
}
}
private async void按钮base\u OnClick(对象发送方,RoutedEventArgs e)
{
对于(var i=0;i这将起作用
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i <= 100; i++)
{
Application.DoEvents();
label1.Text = i.ToString();
Thread.Sleep(100);
}
}
private void按钮1\u单击(对象发送者,事件参数e)
{
对于(int i=0;i您可以使用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
{
}
}
ThreadStart-safir;
线程Nakh;
委托无效kar(字符串p);
私有无效按钮1\u单击(对象发送者,事件参数e)
{
safir=新螺纹起点(NeveshtanDarBarchasb);
Nakh=螺纹(safir);
Nakh.Start();
}
公共空间无需标准化
{
对于(int i=0;i为什么不在Windows应用程序中尝试使用计时器控件?设置适当的间隔,并在计时器运行时禁用计时器一次。)done@MuhammedShevilKP我的问题只是一个例子我想同时显示一些单词
看起来不像你想做的那样。同时显示意味着它们在同一时间都可见e-->label1.Text=String.Join(“,words)定时器的使用意味着任务将在线程线程中执行。这不会引起访问UI控件的问题吗?它不需要上下文切换,导致性能影响吗?不确定,为什么你认为这个解决方案是理想的。@ 3615是不正确的。WiFrice定时器事件处理程序发生在UI线程中。o需要编组。这是一个非常好的WIN32thing@MickyD好的,谢谢你纠正我。但这与System.Threading.Timer也有关系吗?很明显,Windows窗体中的应用程序是要使用的应用程序,但我的注释基于其他Timer类,因为它没有明确指定。@3615不用担心。不,因为System.tThreading.Timer使用不同的线程。对于WinForms应用程序(OP的问题),如果要与GUI交互,建议使用System.Windows.Forms.Timer
。请参阅备注Application.DoEvents()
可能会导致应用程序命令处理程序重新进入;通常是邪恶的;并且不善待puppies.System.Threading.Timer,如果其目的是更新UI,则不应在WinForms中使用。“”。此外,如果使用System.Windows.Forms.Timer,则不需要调用()
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;
}
}