Windows窗体应用程序中的异步显示c#

时间:2016-05-13 08:14:12

标签: 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", "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;之前不会显示任何内容已经完成了。

6 个答案:

答案 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;
       }
}