2015-04-05 51 views
-1

你好,我有一段代碼,其中你可以看到有一個按鈕事件,其中包含啓動屏幕快照方法的線程。而這個截圖方法有無限循環,它繼續在循環內運行代碼。 我的問題是,如果我們把相同的屏幕截圖方法代碼放在Button事件中。將像線程一樣執行相同的操作。爲什麼在這裏使用線程?

以下是代碼。

private void button1_Click(object sender, EventArgs e) 
    { 
     Thread thread = new Thread(screenshot); 
     thread.Start(); 
    } 
    void screenshot() 
    { 
     for (; ;) 
     { 
      Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height); 
      Graphics graphics = Graphics.FromImage(bitmap as Image); 
      graphics.CopyFromScreen(0, 0, 0, 0, bitmap.Size); 
      pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; 
      pictureBox1.Image = bitmap; 
     } 
    } 
+0

如果你把它放在'Click'事件,那麼它將阻止UI線程和UI不會迴應,即您將能夠單擊按鈕等。 – MotoSV 2015-04-05 14:03:51

+0

是的,你是正確的,它會阻止UI線程我已經嘗試過這是阻止UI,但是背後的原因是什麼這阻塞?對不起,我是線程新手,爲什麼要問這樣的問題。 – 2015-04-05 14:06:28

+0

在這裏使用不正確,從不是主線程的線程訪問UI。 – harold 2015-04-05 14:13:26

回答

1

如果你把它放在Click事件,那麼它會阻止UI線程和UI也不會響應,也就是你將能夠點擊按鈕等。通過把它放在一個單獨的線程都線程可以同時運行,因此在screenshot方法中的代碼正在運行時,您仍可以與UI進行交互。如果你有一個無限循環,那麼在循環之後的代碼不能運行,直到你退出循環,所以在這個例子中,UI線程在卡在for循環中時不能繼續。

3

使用線程的原因:screenshot()方法是一個無限循環。它永遠不會讓手回到UI線程。

如果直接調用它,它將完全阻止UI並導致應用程序窗口凍結。

WinForms應用程序有是處理所有消息的消息循環的背後發送的窗口:

while(GetMessage(&msg, NULL, 0, 0) > 0) 
{ 
    TranslateMessage(&msg); 
    DispatchMessage(&msg); // this will call your button1_Click() method 
} 

如果您在button1_Click()方法相依相偎,可以處理任何其他消息,這就是爲什麼應用程序變得反應遲鈍。

你不應該創建一個線程,有更好的方法:

  • 使用定時器
  • 使用的await /異步