Бесконечный цикл в отдельном потоке - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Помогите пожалуйста решить проблему. Есть метод relayStatus. Данный метод опрашивает определенное устройство путем ввода команды и чтения ответа из буфера.
private void relayStatus()
        {
                try
                {
                    asyncHandle = mbSession.BeginWrite("ROUT:CLOS? (@F01A11(0101:0106))", new AsyncCallback(OnWriteComplete), null);
                    asyncHandle = mbSession.BeginRead(mbSession.DefaultBufferSize, new AsyncCallback(relayStatusResult), null);
                    System.Threading.Thread.Sleep(100);
 
                }
                catch
                {
                    
                }                                    
        }
Мне нужно реализовать автоматический вызов данного метода каждые 0.25 сек, так что бы можно было пользоваться другими функциями приложения. Пытался реализовать в отдельном потоке с бесконечным циклом и тред слипом.Как то вот так :
public MainForm()
        {
            Thread t = new Thread(relayStatus);
            t.Start();                                
                       
        }
 
private void relayStatus()
        {
                while(true)
                {
                try
                {
                    asyncHandle = mbSession.BeginWrite("ROUT:CLOS? (@F01A11(0101:0106))", new AsyncCallback(OnWriteComplete), null);
                    asyncHandle = mbSession.BeginRead(mbSession.DefaultBufferSize, new AsyncCallback(relayStatusResult), null);
                    System.Threading.Thread.Sleep(250);
 
                }
                catch
                {
                    
                }
                }
В итоге приложение отказывается запускаться либо виснет... Прошу не кидаться камнями, в шарпе вторую неделю работаю. Но очень нужно это дело реализовать. Спасибо!
Сделал так:
public MainForm()
        {
            Thread t = new Thread(relayStatus);
            t.Start();                                
                       
        }
 
private void relayStatus()
        {
                while(true)
                {
                try
                {
                    asyncHandle = mbSession.BeginWrite("ROUT:CLOS? (@F01A11(0101:0106))", new AsyncCallback(OnWriteComplete), null);
                    asyncHandle = mbSession.BeginRead(mbSession.DefaultBufferSize, new AsyncCallback(relayStatusResult), null);
                    System.Threading.Thread.Sleep(250);
                    Application.DoEvents();
 
                }
                catch
                {
                    
                }
                }
Заработало! Но во первых тормозит программа, во вторых иногда вылетает. Подскажите как сделать по правильному? Смысл вот в чем. С помощью данного метода запускается метод обновляющий индикацию в интерфейсе. То есть если к девайсу подключились с другого компа и что-то изменили в настройках, я вижу эти изменения риалтайм.

Решение задачи: «Бесконечный цикл в отдельном потоке»

textual
Листинг программы
var timer = new Timer(1000); //таймер срабатывает каждую секунду
timer.Elapsed += (sender, e) => MessageBox.Show("Timer elapsed"); //И печатает на экран что-то
timer.Start();

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.25 из 5
Похожие ответы