//выполнить таск void doTask(BatteryTesterTask task) { if (task.Operation == BatteryTesterTask.Operations.SetData) { lock (locker) port.SendCommand(task.Data); if (go.WaitOne(500)) // Ожидаем сигнала начать... { lock (responce) { //test task.check(responce); } return; } else { throw new Exception("Set Request error"); } } }
//запуск в своем потоке //постоянный опрос параметоров private void kollector() { const int MaxLink = 5; int link = MaxLink; int chanN = 0; LinkState = false; addLog("Коллектор открыт "); try { while (isListening) { try { getChannelData(chanN); chanN++; chanN %= 8; if (chanN == 0) { //getTemp(); //getRef(); wh.WaitOne(1000); } if (LinkState == false) { LinkState = true; addLog("Link enabled"); } link = MaxLink; } catch (Exception) { if (link != 0) { if (--link == 0) { LinkState = false; addLog("NoLink"); break; //linkLabel.Dispatcher.BeginInvoke((Action)(() => { linkLabel.Foreground = Brushes.Red; })); } } } BatteryTesterTask task = null; lock (locker) { if (tasks.Count > 0) { task = tasks.Dequeue(); if (task == null) { break; } } } try { if (task != null) { doTask(task); //string resp = getCotekData(task); //if (resp != null) addLog(task + resp + " OK"); //else addLog(task + "ERROR!!!"); } else { // wh.WaitOne(1000); } } catch (Exception e) { addLog(e.Message); } } addLog("Коллектор закрыт "); } catch (Exception e) { // receivingUdpClient.Close(); //linkLabel.Dispatcher.BeginInvoke((Action)(() => { linkLabel.Foreground = Brushes.Black; })); addLog(e.Message + "Коллектор закрыт "); } }
public void EnqueueTask(BatteryTesterTask task) { lock (locker) tasks.Enqueue(task); wh.Set(); }