簡體   English   中英

Windows 窗體應用程序中的異步顯示 C#

[英]Asynchronous Displaying in Windows Form Application c#

我認為以下問題很少見。 但由於我不知道如何尋找正確的答案,所以我仍然堅持下去。

我在表單中有一個標簽,我想同時顯示一些單詞

    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);
        }
    }

標簽只顯示“eft”,在“for”完成之前不會顯示任何內容。

理想情況下,您應該使用 System.Windows.Forms.Timer 進行更新 - 否則您將阻塞主線程。 但是,您可以調用 Form.Refresh 來強制在循環中進行更新。

您可以使用不會阻塞 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);
            }
        }

使用這個解決方案不需要創建任何額外的線程,所以它應該更有效率。

嘗試這個

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 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() ,以便您的應用程序可以處理其他事件

您可以使用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 ;
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;
       }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM