2015-04-05 4 views
-1

Привет, у меня есть код ниже, в котором вы можете видеть, что есть событие кнопки, которое содержит поток, который запускает метод скриншотов. и этот метод скриншота имеет бесконечный цикл, который продолжает работать внутри цикла кода. Мой вопрос в том, что если мы поместим тот же код метода скриншота внутри события Button. будет работать так же, как и потоки.Почему Threading используется здесь?

Ниже приведен код.

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' события, то это блокирует поток пользовательского интерфейса, и пользовательский интерфейс не будет отвечать, т. е. вы могли бы нажимать кнопки и т. д. – MotoSV

+0

да, вы правы, он заблокирует поток пользовательского интерфейса, я пробовал это, он блокирует пользовательский интерфейс, но в чем причина эта блокировка ?? жаль, что я новичок в threading, поэтому задаю такие вопросы. –

+0

Здесь используется неправильно, обращаясь к пользовательскому интерфейсу из потока, который не является основным потоком. – harold

ответ

1

Если вы поместите его в Click случае, то он будет блокировать поток пользовательского интерфейса и интерфейс не будет реагировать, то есть вы сможете нажимать кнопки и т.д. Поставив его в отдельном потоке и потоки могут запускаться одновременно, поэтому вы можете взаимодействовать с пользовательским интерфейсом, пока работает код в методе screenshot. Если у вас бесконечный цикл, тогда код после этого цикла не может работать до тех пор, пока вы не выйдете из цикла, поэтому в этом случае поток пользовательского интерфейса не может продолжаться, если он застрял в цикле for.

3

Причина использования резьбы: screenshot() Метод представляет собой бесконечный цикл. Он никогда не вернет руку в поток пользовательского интерфейса.

Если он вызван напрямую, он полностью заблокирует пользовательский интерфейс и заставит окно приложения заморозить.

За приложением WinForms существует цикл обработки сообщений, который обрабатывает все сообщения посылают окна:

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

Если вы навсегда остаться в button1_Click() методом, никакое другое сообщение не может быть обработано, и именно поэтому приложение перестает отвечать на запросы ,

Вы не должны создавать нить, есть более эффективные способы:

  • с использованием таймера
  • с использованием Await/асинхронной
Смежные вопросы