2011-09-20 3 views
1

Quartz .NET 작업을 사용하여 직렬 포트에서 데이터를 주기적으로 가져옵니다. 문제는 다른 프로그램에서 직렬 포트를 사용하는 경우 작업이 30 분 안에 다시 시도해야한다는 것입니다. 어떻게해야합니까?Quartz .Net 작업 자체를 다시 예약해야합니다

public virtual void Execute(JobExecutionContext context) 
    { 
     SetYModemEvents(); 
     JobDataMap data = context.JobDetail.JobDataMap; 
     string COM = data.GetString("COM"); 
     string BAUD = data.GetString("BAUD"); 
     string name = data.GetString("NAME"); 

     _yModem.AllowDisconnect = true; 

     _connection.Port.PortName = COM; 
     try 
     { 
      _connection.Port.BaudRate = int.Parse(BAUD); 
     }catch(FormatException) 
     { 
      _connection.Port.BaudRate = 9600; 
     } 
     try 
     { 
      _connection.Port.Open(); 
     }catch(UnauthorizedAccessException ex) 
     { 
      //Reschedule this job 

     } 

     _connection.Port.DataReceived += new SerialDataReceivedEventHandler(DataReceviedHandler); 
     DeadManSwitch.Tick += new EventHandler(DeadManSwitch_Tick); 
     DeadManSwitch.Start(); 

     if(Properties.Settings.Default.UseBubbels) 
     { 
      ReadOutHelperClass.ShowNotifiy(name, mynotifyicon); 
     } 

     //Starten der Auslesung 
     _connection.Write(protocoll.ReadLoggerData(), 0, protocoll.ReadLoggerData().Length); 
     DeadManSwitch.Interval = DeadManTimeOut; 

    } 
+1

여기 내 솔루션을 작성했습니다. http://stackoverflow.com/a/42744559/1393052 –

답변

0

나는 뭔가를 시도했다. 이것은 방금 연기 된 옛날의 사본 인 새로운 직업을 추가합니다. 어쩌면 기존 작업에 다른 트리거를 추가하는 것이 더 좋지만 두 번째 트리거를 사용하여 작업하지 않도록하십시오.

public virtual void Execute(JobExecutionContext context) 
    { 
     SetYModemEvents(); 
     JobDataMap data = context.JobDetail.JobDataMap; 
     string COM = data.GetString("COM"); 
     string BAUD = data.GetString("BAUD"); 
     string name = data.GetString("NAME"); 

     _yModem.AllowDisconnect = true; 

     _connection.Port.PortName = COM; 
     try 
     { 
      _connection.Port.BaudRate = int.Parse(BAUD); 
     }catch(FormatException) 
     { 
      _connection.Port.BaudRate = 9600; 
     } 
     try 
     { 
      _connection.Port.Open(); 
     }catch(UnauthorizedAccessException ex) 
     { 
      //TODO Testen 
      Trigger[] trArray = context.Scheduler.GetTriggersOfJob(context.JobDetail.Name, context.JobDetail.Group); 
      if (trArray.Length >= 2) 
      { 
       trArray.ToList().RemoveRange(1, 1); 
      } 
      JobDetail JB = context.JobDetail; 
      Trigger delayTrigger = new SimpleTrigger(JB.Name + "_Delay", "DGroup", DateTime.UtcNow.AddMinutes(_delay), null, 1, TimeSpan.FromMinutes(_delay)); 
      JB.Name = JB.Name + "_Delay"; 
      JB.Group = "DGroup"; 

      context.Scheduler.ScheduleJob(context.JobDetail, delayTrigger); 
      return; 
     } 


     _connection.Port.DataReceived += new SerialDataReceivedEventHandler(DataReceviedHandler); 
     DeadManSwitch.Tick += new EventHandler(DeadManSwitch_Tick); 
     DeadManSwitch.Start(); 

     if(Properties.Settings.Default.UseBubbels) 
     { 
      ReadOutHelperClass.ShowNotifiy(name, mynotifyicon); 
     } 

     //Starten der Auslesung 
     _connection.Write(protocoll.ReadLoggerData(), 0, protocoll.ReadLoggerData().Length); 
     DeadManSwitch.Interval = DeadManTimeOut; 

    } 
관련 문제