2015-07-27 4 views
2

Я новичок в C#, и у меня есть устройство (периферийное), которое мне нужно для опроса через последовательный порт/USB из приложения консоли C#. Хотя приведенный ниже код, по-видимому, не вызывает никаких исключений (ошибок) и не выполняет опрос. Что может случиться? Благодарю.Использование параллельной библиотеки задач (TPL) для опроса

Выход консоли:

Here goes... 
t1: System.Threading.Tasks.Task 

PD. От отладки у меня сложилось впечатление, что while (true) {...} блок не работает.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using T1NET; 

namespace ValController 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 

      T1NET.comm Device = new T1NET.comm(); 
      bool devfound = true; 
      Device.Port = new T1NET.COM_port(); 
      Device.Port.RtsEnable = false; 
      Device.HandlePort = true; 
      Device.Port.BaudRate = 9600; 
      Device.Port.PortName = "COM4"; 
      Device.Device = T1NET.Device.Valid; 
      Device.Port.ReadTimeout = 100; 

      if (devfound) 
      { 
       BV_Device.HandlePort = true; 
       Console.WriteLine("here goes..."); 
       var t1 = Task.Factory.StartNew(() => 
       { 
        while (true) 
        { 
         System.Threading.Thread.Sleep(100); 
         System.Threading.Thread.BeginCriticalRegion(); 
         T1NET.Answer answer = Device.RunCommand(T1NET.T1NETCommand.Poll); 
         Console.WriteLine("answer:" + answer); 
        } 
       }); 

       Console.WriteLine("t1: " + t1); 

      } 
     } 
    } 
} 
+0

Единственный способ, которым 'while' не выполняется, - это если задача никогда не запускается (см. Http://stackoverflow.com/questions/12010131/task-factory- StartNew-не-выполнение-на-задачи-когда-развернутый). Если это не так, попробуйте помещать перерыв непосредственно перед вашим оператором 'answer = ...' внутри цикла while, он попадает более одного раза? Возможно, ваша задача ждет ответа на неопределенное время при первом исполнении. – Vlad

+0

Подождите ... Я просто понял, что вы начинаете асинхронную задачу, а затем программа заканчивается. Попробуйте дождаться завершения задачи. – Vlad

+0

Привет, Влад, спасибо, но он ведет себя точно так же. – ekremer

ответ

2

В вашем примере вы начали новые асинхронные задачи, в то же время вашего приложение продолжает свое выполнение до конца метода Main и вдруг выходит, прежде чем ваша новая задача даже есть шанс выполнения его содержания (в вашем случае, while loop).

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

static void Main(string[] args) 
{ 
    //// Your initialization code 

    if (devfound) 
    { 
     //// Device found, prepare for task 
     var t1 = Task.Factory.StartNew(() => 
     { 
      //// Task body 
     }); 

     t1.Wait(); 
    } 
} 
+0

Спасибо за вашу детальную реализацию. – ekremer

0

Всякий раз, когда вы делаете программирования асинхронных, и вы начинаете отдельную задачу для выполнения действий, в то время как вы делаете другие вещи, то есть должен быть каким-то местом в момент, когда вы будете ждать результатов от другая задача.

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

Вы можете проверить статус другой задачи, но тогда вы знаете только, запущен ли он, возможно, он выполнил только первый оператор. Вы никогда не будете уверены, когда будут делать следующие утверждения.

Правильные способы узнать о статусе другой задачи: - Подождите, пока он закончит. Полезно, если вам нужен только результат - Подождите, пока некоторые семафоры/события/и т. Д. Будут сигнализированы. Полезно, если вам нужно получать информацию о прогрессе других задач

+0

** Привет Харальд **, спасибо за ваши комментарии. Я буду помнить их, поскольку я продвигаюсь в этом проекте. – ekremer

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