저는 서버/클라이언트 응용 프로그램을 개발하고 있습니다. 서버는 시간 간격으로 클라이언트에 메시지를 보냅니다. 각 메시지는 다른 시간 속성을 가질 수 있습니다.웹 소켓을 통해 클라이언트에 메시지를 보냅니다. 각 메시지마다 다른 시간 간격이 있습니다.
어떻게 접근하면 좋을까요? 스레드를 일시 중지 할 수 있지만 조금 해킹 것 같습니다. 이 시나리오에 가장 적합한 방법이 있습니까?
저는 서버/클라이언트 응용 프로그램을 개발하고 있습니다. 서버는 시간 간격으로 클라이언트에 메시지를 보냅니다. 각 메시지는 다른 시간 속성을 가질 수 있습니다.웹 소켓을 통해 클라이언트에 메시지를 보냅니다. 각 메시지마다 다른 시간 간격이 있습니다.
어떻게 접근하면 좋을까요? 스레드를 일시 중지 할 수 있지만 조금 해킹 것 같습니다. 이 시나리오에 가장 적합한 방법이 있습니까?
을 볼 수 있습니다 가정 간단한 타이머 수, (당신은 태그를 추가)
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);
}
}
이 타이머가 다시 시작을 확인하려면 다음 작업을 할
Quartz.NET을 사용할 수 있습니다. 태그에 의해
, 당신이 C#을 사용하는, 그래서 당신은 당신이SignalR
을 사용하고자하는 가정 작업 클래스에 대한
Microsoft doc (이 스레드를 구현)
다음 자습서를 찾아 볼 수도 있습니다. [ASP.NET을 사용하여 Windows 서비스를 시뮬레이션하여 예약 된 작업 준비] (https://www.codeproject.com/kb/aspnet/aspnetservice.aspx) –
이것은 좋은 접근 방법입니다. 제 경우에는 message1과 같은 시나리오가 있습니다 : send를 보낸 후 30 초를 기다렸다가 message2를 보내고 60 초를 기다립니다. Timer initializer의 네 번째 인수에이 시간 매개 변수를 제공해야합니까? – Seamus
글쎄, 그게 당신의 애플 리케이션의 논리에 따라 다릅니다. 동시에 연결된 모든 사용자에게 해당 메시지를 보내시겠습니까? 이 경우 메시지를 보낼 때마다 타이머 간격을 변경하거나 타이머를 사용하여 한 번 실행하고 새 타이머를 만들 수 있습니다. 서로 다른 간격으로 특정 사용자에게 메시지를 보내야하는 경우 서버간에 클라이언트로 푸시하는 것과 관련이없는 다른 질문이 될 수 있습니다. – xleon
답변을 편집하여 간격을 변경하십시오 – xleon