직렬 포트와 통신해야하는 프로그램을 작성 중입니다. 내 주요 관심사는 충돌을 방지하고 동시에 다른 기능에서 쓰거나 읽지 않도록하는 것입니다.다중 스레드 간 코드 실행
처음에는 시스템 타이머가 처음부터 시작되어 주기적으로 직렬 포트에 데이터를 쓰고 주어진 시간 초과 값으로 응답을 수신하는 데 사용됩니다. 따라서 Elapsed 이벤트가 발생하고 작업을 수행합니다.
둘째, 다른 기능이 더 높은 우선 순위로 제공되며 직렬 포트에 데이터를 즉시 작성해야합니다.
시나리오 1 Elapsed 이벤트가 1 분마다 발생하고 이전 이벤트에서 보류 중이거나 SendImmediately 기능을 수행하지 않습니다.
시나리오 2 SendImmediately를 호출하는 경우 현재 실행중인 OnTimedEvent가 완료 될 때까지 기다려야합니다. 다시 한번, SendTermedEvent의 다음 실행은 SendImmediately가 완료 될 때까지 중지됩니다.
질문. 이전에 OnTimedEvent가 실행되기 전에 다음에 실행되지 않도록하려면 어떻게해야합니까? 아니면 SendImmediately가 끝나기 만합니까? 기본적으로 각각의 간섭을 방지합니다.
나는 약간의 Q를 겪었다. & A. 많은 제안 답변이 아래와 같이 있습니다
- 비활성화 및 활성화 타이머
- AutoResetEvent (2 방식으로 신호)
- 으로 ManualResetEvent
- Monitor.Enter/Monitor.Exit (잠금)
- 큐
- 수면/가입/작업 기다림 (차단)
난 고체가 없습니다. 각 시나리오가 다른 시나리오와 함께 제공 되었기 때문에 어느 시나리오가 적합한 지 또는 적절한 방법인지 결정하기 위해 필요합니다. 어떤 조언을 주셔서 감사합니다.
public System.Timers.Timer aTimer = new System.Timers.Timer(Properties.Settings.Default.Interval * 60 * 1000);
public bool InitialTimer(int interval, bool action)
{
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval = interval;
aTimer.Enabled = action;
GC.KeepAlive(aTimer);
return action;
}
public void OnTimedEvent(object source, ElapsedEventArgs e)
{
// write something to serial port
}
public void WriteImmediately()
{
// write something to serial port
}