2017-01-29 2 views
0

저는 서버/클라이언트 응용 프로그램을 개발하고 있습니다. 서버는 시간 간격으로 클라이언트에 메시지를 보냅니다. 각 메시지는 다른 시간 속성을 가질 수 있습니다.웹 소켓을 통해 클라이언트에 메시지를 보냅니다. 각 메시지마다 다른 시간 간격이 있습니다.

어떻게 접근하면 좋을까요? 스레드를 일시 중지 할 수 있지만 조금 해킹 것 같습니다. 이 시나리오에 가장 적합한 방법이 있습니까?

답변

1

을 볼 수 있습니다 가정 간단한 타이머 수, (당신은 태그를 추가)

public class Startup 
{ 
    private MatchingSupervisor _conversationManager; 

    public void Configuration(IAppBuilder app) 
    { 
     // TODO app configuration 

     // Ensure supervisor starts 
     _supervisor = MatchingSupervisor.Instance; 
    } 
} 
: 시스템 또는 응용 프로그램 다시 시작 (시스템이 다운 응용 프로그램 재활용 등을했다), 당신은 Owin 시작 클래스 인스턴스를 받아야 할 때

public sealed class MatchingSupervisor 
{ 
    private static readonly ILog Log = LogManager.GetLogger(typeof(MatchingSupervisor)); 
    private readonly IHubContext _hub; 
    private readonly Timer _timer; 

    #region Singleton 

    public static MatchingSupervisor Instance => SupervisorInstance.Value; 

    // Lazy initialization to ensure SupervisorInstance creation is threadsafe 
    private static readonly Lazy<MatchingSupervisor> SupervisorInstance = new Lazy<MatchingSupervisor>(() => 
      new MatchingSupervisor(GlobalHost.ConnectionManager.GetHubContext<YourHubClass>())); 

    private MatchingSupervisor(IHubContext hubContext) 
    { 
     _hub = hubContext; 
     _timer = new Timer(Run, null, 0, Timeout.Infinite); 
    } 

    #endregion 

    private async void Run(object state) 
    { 
     // TODO send messages to clients 

     // you can use _timer.Change(newInterval, newInterval) here 
     // if you need to change the next interval 
     var newInterval = TimeSpan.FromSeconds(60); 
     _timer.Change(newInterval, newInterval); 
    } 
} 

이 타이머가 다시 시작을 확인하려면 다음 작업을 할

+0

이것은 좋은 접근 방법입니다. 제 경우에는 message1과 같은 시나리오가 있습니다 : send를 보낸 후 30 초를 기다렸다가 message2를 보내고 60 초를 기다립니다. Timer initializer의 네 번째 인수에이 시간 매개 변수를 제공해야합니까? – Seamus

+0

글쎄, 그게 당신의 애플 리케이션의 논리에 따라 다릅니다. 동시에 연결된 모든 사용자에게 해당 메시지를 보내시겠습니까? 이 경우 메시지를 보낼 때마다 타이머 간격을 변경하거나 타이머를 사용하여 한 번 실행하고 새 타이머를 만들 수 있습니다. 서로 다른 간격으로 특정 사용자에게 메시지를 보내야하는 경우 서버간에 클라이언트로 푸시하는 것과 관련이없는 다른 질문이 될 수 있습니다. – xleon

+0

답변을 편집하여 간격을 변경하십시오 – xleon

0

Quartz.NET을 사용할 수 있습니다. 태그에 의해

, 당신이 C#을 사용하는, 그래서 당신은 당신이 SignalR을 사용하고자하는 가정 작업 클래스에 대한 Microsoft doc (이 스레드를 구현)

+0

다음 자습서를 찾아 볼 수도 있습니다. [ASP.NET을 사용하여 Windows 서비스를 시뮬레이션하여 예약 된 작업 준비] (https://www.codeproject.com/kb/aspnet/aspnetservice.aspx) –