c\#타이머 와 관찰자 모드 를 사용 하여 경보 푸 시 수 요 를 실현 합 니 다.
이틀 동안 한 사물 인터넷 회사 의 고급 연구 개발 을 면접 보 았 는데 면접 문 제 는 다음 과 같다.
회사 지도자,부서 주관,팀장,팀 원 4 급,전염병 경보 가 있 으 면 팀 원 에 게 먼저 통지 하고(개인 에 게 는 주로 한 가지 처리 가 있 으 면 처리)3 분 동안 처리 하지 않 으 면 팀장 에 게 문 자 를 보 내 고 팀장 이 3 분 동안 처리 하지 않 으 면 상부 로 전송 한다.한 등급 한 등급.단일 프로그램 병행 최소 1000 tps 조기 경보 지원 요청
솔직히 위 에서 필요 한 것 은 내 가 한 과거 프로젝트 에서 비슷 한 수요 가 있 었 고 나 도 내 가 어떻게 했 는 지 어렴풋이 기억 할 뿐이다.제3자 퀘 스 트 스케줄 링 프레임 워 크 를 사용 하여 위의 3 분 초과 처 리 를 완성 한 다음 에 등급 별 발송 은 더욱 간단 하 다.더 이상 if,else 와 같은 가장 원시 적 인 검증 을 사용 하면 된다.근 데 이런 문 제 를 면접 문제 에 던 져 서 당 황 스 러 웠 어 요.자연 최종 결과 도 만 족 스 럽 지 못 하 다.
수요 분석
며칠 이 지나 도 손 으로 코드 를 훑 어야 한다 고 생각 합 니 다.그렇지 않 으 면 어떻게 성장 합 니까?
수 요 를 분리 해서 얻 을 수 있 는 소식 은 한 가지 사건 이 있다.이 사건 은 바로 신고 사건 이다.신고 사건 을 통 해 서로 다른 직위 의 직원 에 게 정 보 를 전달 해 야 하고 직무 에 따라 아래 에서 위로 해 야 한다.그러나 직원 이 신고 소식 을 받 으 면 신고 통지 가 이미 완성 되 었 다 고 표시 하고 그 다음 에 3 분 동안 처리 해 야 한다.
위의 수요 분석 을 통 해 우 리 는 반드시 매 거 진 것 을 정의 하고 직명 의 높 고 낮 음 을 기록 해 야 한 다 는 것 을 알 수 있다.
/// <summary>
///
/// </summary>
public enum JobLevel : int
{
= 1,
= 2,
= 3,
= 4
}
그 다음 에 우 리 는 적어도 두 가지 유형 이 존재 한다.하 나 는 신고 대상 이다.이 대상 은 통지 해 야 할 신고 정보 와 신고 정보 발송 결과 가 있 기 때문에 당연히 우리 가 신고 메 시 지 를 구독 한 구독 자가 빠 질 수 없다.여기 서 생각해 보 니 관찰자 디자인 모델 로 결합 을 풀 수 있 습 니 다.
/// <summary>
///
/// </summary>
public interface IPublish
{
/// <summary>
/// ( )
/// </summary>
/// <param name="subscriber"></param>
void AddSubscriber(SubscriberPeopleBase subscriber);
/// <summary>
/// ( )
/// </summary>
/// <param name="subscriber"></param>
void RemoveSubscriber(SubscriberPeopleBase subscriber);
/// <summary>
///
/// </summary>
void SendNotify();
/// <summary>
///
/// </summary>
/// <param name="msg"> </param>
void CreateJB(string msg);
다음은 위의 인 터 페 이 스 를 실현 하 는 것 이다!
/// <summary>
///
/// </summary>
public class Baojing : IPublish
{
/// <summary>
///
/// </summary>
public List<SubscriberPeopleBase> SubscriberLst { get; set; }
/// <summary>
///
/// </summary>
public string Msg { get; set; }
/// <summary>
///
/// </summary>
public bool IsSucess { get; set; }
/// <summary>
///
/// </summary>
public Timer NotifyTimer { get; set; }
/// <summary>
///
/// </summary>
public JobLevel CurrentJobLevel = JobLevel. ;
public void AddSubscriber(SubscriberPeopleBase subscriber)
{
if (SubscriberLst == null) SubscriberLst = new List<SubscriberPeopleBase>();
SubscriberLst.Add(subscriber);
}
public void CreateJB(string msg)
{
Msg = msg;
}
public void RemoveSubscriber(SubscriberPeopleBase subscriber)
{
if (SubscriberLst != null) SubscriberLst.Remove(subscriber);
}
/// <summary>
///
/// </summary>
public void SendNotify()
{
if (SubscriberLst?.Count > 0)
{
//
SubscriberLst.OrderByDescending(p => (int)p.Title);
// CheckNotifySendResult, 3
NotifyTimer = new Timer(CheckNotifySendResult, null, 0, 3000);
}
}
public void CheckNotifySendResult(object stat)
{
// ,
NotifyTimer.Change(-1, 3000);
//
SubscriberPeopleBase subscriberPeople = SubscriberLst.Find(p =>
(((int)CurrentJobLevel + 1) - (int)p.Title) == 1);
if (subscriberPeople == null) return; //
if (!IsSucess)
{
IsSucess = subscriberPeople.ReceiveData(this);
if (!IsSucess)
{
CurrentJobLevel = CurrentJobLevel!= JobLevel. ?(JobLevel)((int)CurrentJobLevel) - 1: JobLevel. ;
NotifyTimer.Change(3000, 3000);
}
}
else
{
Console.WriteLine($" {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
NotifyTimer.Dispose();
}
}
}
구독 자가 필요 합 니 다.구독 자 는 추상 적 인 방식 으로 결합 성 을 낮 춰 야 합 니 다.(사실은 이벤트 버스 를 사용 하여 결합 성과 확장 성 을 한 단계 높 여야 합 니 다)
/// <summary>
///
/// , ,
/// , ,
/// </summary>
public abstract class SubscriberPeopleBase
{
/// <summary>
/// ( )
/// </summary>
public JobLevel Title { get; set; }
public SubscriberPeopleBase(JobLevel title)
{
Title = title;
}
public virtual bool ReceiveData(Baojing baojing)
{
if (Title == JobLevel. )
{
Console.WriteLine($" :{baojing.Msg}, :{Title.ToString()} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
return true;
}
else
{
Console.WriteLine($" :{baojing.Msg}, :{Title.ToString()}, {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
return false;
}
}
}
하위 클래스 를 더 해 경 보 를 받 는 방법 을 다시 쓰 세 요.
public class SubscriberPeople : SubscriberPeopleBase
{
public SubscriberPeople(JobLevel title) : base(title) { }
public override bool ReceiveData(Baojing baojing)
{
if (Title == JobLevel. )
{
Console.WriteLine($" :{baojing.Msg}, :{Title.ToString()} {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
return true;
}
else
{
Console.WriteLine($" :{baojing.Msg}, :{Title.ToString()}, {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}");
return false;
}
}
}
결국 저의 메 인 방법 은 이 렇 습 니 다.
static void Main(string[] args)
{
IPublish publish = new Baojing();
publish.AddSubscriber(new SubscriberPeople(JobLevel. ));
publish.AddSubscriber(new SubscriberPeople(JobLevel. ));
publish.AddSubscriber(new SubscriberPeople(JobLevel. ));
publish.AddSubscriber(new SubscriberPeople(JobLevel. ));
publish.CreateJB(" !");
publish.SendNotify();
Console.ReadLine();
}
디 버 깅 효 과 는 다음 과 같 습 니 다.내일 도 보완 하에 EventBus 를 사용 하여 결합 성 을 다시 낮 추 는 동시에 수신 방법 을 더욱 유연성 있 게 하고 서로 다른 등급 의 직원 들 이 서로 다른 응답 을 할 수 있 습 니 다!
이상 은 c\#타이머 와 관찰자 모드 를 사용 하여 경보 푸 시 수 요 를 실현 하 는 상세 한 내용 입 니 다.c\#경보 푸 시 수 요 를 실현 하 는 자 료 는 우리 의 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.