2015-10-17 21 views
1

我在Windows窗體應用程序中繪製了一個以特定形狀繪製像素的循環,但我想讓用戶看到它正在繪製。在等待中減慢Winforms中的循環

有問題的循環:

public async void Bar() 
    { 
     for (int i = 0; i < 10000; i++) 
     { 
      await Task.Delay(100); 

      Foo(); 
     } 
    } 

Bar()僅僅是從UI線程非靜態函數調用。

Foo()應該在位圖上繪製像素並執行(根據調試器),但實際上並沒有繪製任何東西。很不尋常。

如果我刪除await語句,它將完美繪製。

+0

嘗試等待/異步,計時器,手動測量日期時間,什麼都沒有。 Thread.Sleep顯然沒有做任何事情。人們總是說「不要屏蔽UI線程」 - 這甚至意味着什麼?這就是要點,我想推遲UI的展示。 –

+1

請發佈一個最小的,完整的問題重現。目前,我們沒有足夠的信息來幫助。 –

+0

查看我的更新回答如何在winforms中做一個緩慢的動畫。 – TaW

回答

1

您可以使用您的代碼,但您需要強制UI線程更新您修改的位圖。爲此該行添加到您的Foo

panel1.Refresh(); 

這是假設你寫顯示位圖屬性直接(見下文!)。當然,您需要將panel1更改爲包含Bitmap的控件;參見下面用於使用外部Bitmap變量或「內部」Image(對於PictureBox)或BackgroundImage(對於Panel或許多其他的)特性的控制的兩個基本情況!

相反,如果你想在一個位圖工作變量Foo看起來是這樣的:

public void Foo() 
{ 
    Bitmap bmp = (Bitmap) panel1.BackgroundImage; 
    // now do your drawing stuff 
    bmp.SetPixel(...); 
    panel1.BackgroundImage = bmp; 
    panel1.Refresh(); 
} 

雖然這會工作,動畫的方式通常做的是通過使用Timer

在使用Timer將打破循環的關鍵:

移動的設定最多,也許Button.Click,其餘移到Timer.Tick,也許是這樣的:現在

計數器在類級別:

int counter = 0; 

Tick保持計數,檢查和繪圖體:

private void timer1_Tick(object sender, EventArgs e) 
    { 
     if (counter > 1000) 
     { 
      timer1.Stop(); 
     } 
     else 
     { 
      angle1 += angle1Modifier; 
      angle2 += angle2Modifier; 
      angle3 += angle3Modifier; 
      DrawPixel(getPoint(angle1, angle2, angle3)); 
      yourCanvasControl.Refresh(); 
     } 
    } 

Click保存設置並啓動循環/定時器:

private void buttonStart_Click(object sender, EventArgs e) 
    { 
     counter = 0; 
     timer1.Interval = 50; 
     timer1.Start(); 
    } 

這工作,因爲Timer與「UI線程」相關聯,這是一個線程完成所有的工作顯示爲以及接受所有的用戶輸入。

顯然,你不應該阻止它,否則你的程序變得緩慢或似乎凍結,但一個Timer,而不是一個Thread.Sleep不會阻塞UI線程,所以它是動畫(一個不錯的選擇,只要他們進入Winforms)。

注:由於您使用的是SetPixel要修改Bitmap,你將需要對持有BitmapTick使其顯示控件添加一個Invalidate()Refresh();讓我們來看看如何做到這一點:

如果您正在修改外部Bitmap bmp你需要重新分配它:

bmp.SetPixel(...); 
panel1.BackgroundImage = bmp; 

如果不是您的modfying的ImageBackgroundImage直接在RefreshInvalidate會做:

((Bitmap)panel1.BackgroundImage).SetPixel(...); 
panel1.Invalidate(); 
+0

是的,工作。我現在更瞭解Timer了;文檔永遠不會有幫助。 –