2015-04-23 2 views
-1

Итак, я изучил, что beginInvoke вызывает метод из другого потока. (Пожалуйста, поправьте меня, если я ошибаюсь)Прояснение BeginInvoke

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    while (true) 
    { 
     this.BeginInvoke((Action)(() => 
     { 
      red_light1 = comport.message(4, 8, 32); 
      if (red_light1 == "1") 
      { 
       ellipse1.FillEllipse(red_on, 250, 133, 24, 24); 
      } 
      else 
      { 
       ellipse1.FillEllipse(red_off, 250, 133, 24, 24); 
       })); 
       Thread.Sleep(300); 
      } 
     } 
    } 
} 

НО я хочу прочитать еще 5 значений в этой «акции», я не знаю, как это назвать.

Как реализовать метод, который читает 6 переменных, как в моем коде, и после его вызова.

method implementation 
{ 

//no parameters & no return value, just read and store the values in variables like "red_light1" and after color some ellipses depending on values (1|0). 

} 

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    while (true) 
    { 
     this.BeginInvoke(**method call**); 
     Thread.Sleep(300); 
    } 
} 

ответ

1

Что вы делаете, не имеет смысла.

Вы, кажется, с помощью BackgroundWorker, который обычно используется для выполнения тяжелых операций (на фоне потока полученной форме ThreadPool), и тогда вы не делаете ничего тяжелого на этом фоне нить

В самом деле вы ничего не делаете в этом:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // a loop that never exits !!!! 
    // no break, no cancel, nothing!!! 
    while (true) 
    { 
     // here is the Background thread 
     //... and absolutely NOTHING happens here... 

     // the code that follows gets invoked on the UI thread 
     // (which defeats the purpose of the BackgroundWorker...) 
     // then immediately returns (because it's asynchronous) 
     // to be invoked again 
     // and again, and again... 
     // (Is your app unresponsive perhaps? doesn't it hang?) 
     this.BeginInvoke((Action)(() => 
     { 
      red_light1 = comport.message(4, 8, 32); 
      if (red_light1 == "1") 
      { 
       ellipse1.FillEllipse(red_on, 250, 133, 24, 24); 
      } 
      else 
      { 
       ellipse1.FillEllipse(red_off, 250, 133, 24, 24); 
       })); 

       // Your UI hangs here !!! 
       // (Because you're putting your UI thread to sleep!) 
       // At least call Thread.Sleep() in the background thread. 
       // Or call synchronous Invoke() instead of asynchronous BeginInvoke() 
       // so your background thread waits untill the operation on UI thread 
       // is completed before trying to perform it again 
       Thread.Sleep(300); 
      } 
     } 
    } 
} 
+0

1. Мне нужно постоянно читать от ардуино, поэтому я сделал бесконечное время. (возможно, это неверно, но это и есть причина). 2. Это не тяжело, потому что я приведу только пример с одной переменной «red_light1». 3. Да, мой пользовательский интерфейс не очень подходит. 4. Exaplain мне пожалуйста, как это сделать – user3672802

+0

это http://www.dreamincode.net/forums/topic/112547-using-the-backgroundworker-in-c%23/ или здесь http://www.codeproject.com/Статьи/99143/BackgroundWorker-Class-Sample-for-Beginners - хорошие примеры использования BackgroundWorker, здесь описывается https://msdn.microsoft.com/en-us/library/ms171728(v=vs.85).aspx как использовать Invoke для обновления интерфейса. Я рекомендую Invoke вместо BeginInvoke, если вы хотите подождать, пока пользовательский интерфейс обновит – Arie

+0

еще один вопрос: используете ли вы класс SerialPort для чтения данных? Если это так, возможно, вам стоит подумать об использовании события DataReceived https://msdn.microsoft.com/en-us/library/system.io.ports.serialport.datareceived%28v=vs.110%29.aspx вместо фоновый рабочий для обработки ваших данных? – Arie

Смежные вопросы