2016-06-03 3 views
1

우리는 정보 교환을 위해 SignalR을 사용하고 있습니다.SignalR. 타이머가 서버에서 멈추지 않습니다.

웹 브라우저가 연결되면 타이머가 시작되지만 사용자가 브라우저를 닫을 때 멈추지 않습니다. 다음은 코드입니다. 브라우저가 연결된 경우 starttimer 기능이 실행됩니다. 사용자가 브라우저를 분리하면 타이머가 서버에서 계속 실행됩니다.

[HubName("myChatHub")] 
public class InboundCallsDataShare : Hub 
{ 
    private OverrideTimer timer ; 
    private List<GroupNConnectionId> groupsList = new List<GroupNConnectionId>(); 
    public void send(string message) 
    { 
     Clients.All.addMessage(message); 
     //Clients..addMessage(message); 

    } 

    public void starttimer(string queue) 
    { 
     //var connectionId = this.Context.ConnectionId; 
     //GroupNConnectionId objGroupNConnectionId=new GroupNConnectionId(); 
     //objGroupNConnectionId.Group = queue; 
     //objGroupNConnectionId.ConnectionID = connectionId; 
     //if(groupsList.Contains(objGroupNConnectionId))return; 
     ////////////////////////////////////////////////////// 
     //groupsList.Add(objGroupNConnectionId); 
     Groups.Add(this.Context.ConnectionId, queue); 
     timer = new OverrideTimer(queue); 
     timer.Interval = 15000; 
     timer.Elapsed +=new EventHandler<BtElapsedEventArgs>(timer_Elapsed); 
     //first time call 
     timer_Elapsed(timer,new BtElapsedEventArgs(){Queue = queue}); 
     //ends 
     timer.Start(); 
     Console.WriteLine("Timer for queue " +queue); 
    } 

    public override Task OnConnected() 
    { 
     return base.OnConnected(); 
    } 
    public override Task OnDisconnected() 
    { 

     //timer.Stop(); 
     return base.OnDisconnected(); 
    } 



    public void getdatafromxml(string queue) 
    { 

     string list = (new Random()).Next(1, 10000).ToString(); 
     Clients.All.getList(list); 

     //Clients..addMessage(message); 

    } 
    public ICBMObject GetInterationList(string queue) 
    { 
     //ININInterations.QueueListViewItemData _obj = new ININInterations.QueueListViewItemData(); 
     return GetInboundCallCountFromXML(queue); 
     //return _obj.MainFunctionIB(); 

    } 

    void timer_Elapsed(object sender, BtElapsedEventArgs e) 
    { 

     ICBMObject objICBMObject = GetInboundCallCountFromXML(e.Queue); 
     Clients.Group(e.Queue).getList(objICBMObject); 
     CreateFile(e.Queue); 
     //Clients.All.getList(objICBMObject); 
    } 

    private void CreateFile(string queue) 
    { 
     string path = @"D:\t.txt"; 
     string text = File.ReadAllText(path); 
     text += queue+ DateTime.Now.ToString() + Environment.NewLine; 
     File.WriteAllText(path, text); 
    } 
    public ICBMObject GetInboundCallCountFromXML(string queue) 
    { 
     FileStream fs = null; 
     int totalInboundCalls = 0, 
       totalInboundCallsUnassigned = 0; 
     string longestDuration = ""; 
     bool updateText = false; 
     try 
     { 
      XmlDataDocument xmldoc = new XmlDataDocument(); 
      XmlNodeList xmlnode; 
      int i = 0; 
      string str = null; 
      fs = new FileStream(AppDomain.CurrentDomain.BaseDirectory + "InboundXML/" + queue + ".xml", 
       FileMode.Open, FileAccess.Read); 
      if (fs.CanRead) 
      { 
       xmldoc.Load(fs); 
       xmlnode = xmldoc.GetElementsByTagName(queue); 

       for (i = 0; i <= xmlnode.Count - 1; i++) 
       { 

        totalInboundCalls = Convert.ToInt32(xmlnode[i].ChildNodes.Item(0).InnerText.Trim()); 
        totalInboundCallsUnassigned = Convert.ToInt32(xmlnode[i].ChildNodes.Item(1).InnerText.Trim()); 
        longestDuration = xmlnode[i].ChildNodes.Item(2).InnerText.Trim(); 

       } 
       updateText = true; 
      } 
     } 
     catch (Exception) 
     { 


     } 
     finally 
     { 
      if (fs != null) 
      { 
       fs.Close(); 
       fs.Dispose(); 
      } 
     } 


     return new ICBMObject() 
     { 
      TotalInboundCalls = totalInboundCalls, 
      TotalInboundCallsUnassigned = totalInboundCallsUnassigned, 
      LongestDuration = longestDuration, 
      UpdateText = updateText 
      //string.Format("{0:D2}:{1:D2}:{2:D2}", 
      // _LongetInbound.Hours, 
      // _LongetInbound.Minutes, 
      // _LongetInbound.Seconds) 
     }; 
    } 

} 
+0

CreateFile (e.Queue); 필요하지 않은 15 초 후에 실행 중입니다. –

+0

창이나 탭을 감지하면 클라이언트 쪽에서 연결 끊기를 호출합니까? –

+0

아니요 클라이언트 측의 연결을 끊을 때 어떤 기능도 호출하지 않았습니다. 하지만 서버 쪽 우리는 public override를 가지고있다. Task OnDisconnected() { if (timer! = null) timer.Dispose(); return base.OnDisconnected(); } –

답변

2

사실 외에도 주석 처리 되었습니까? 타이머에 브레이크 포인트를 두어 치는지 확인 했습니까? onDisconnect를 호출하는 데 지연이있을 수 있으며 timeout 속성이 너무 크게 설정되어 있으면 실행되지 않을 수 있습니다. 클라이언트가 닫혔다는 것을 모르는 경우 onReconnected를 입력 할 수 있습니다.

+0

여기에 설명 된 일련의 이벤트는 보장되지 않습니다. SignalR은이 계획에 따라 예측 가능한 방식으로 연결 수명 이벤트를 발생시키려는 모든 시도를하지만 네트워크 이벤트의 다양한 변형과 ​​전송 API와 같은 기본 통신 프레임 워크가 다양한 방식으로 처리합니다. 예를 들어, 클라이언트가 다시 연결될 때 다시 연결 이벤트가 발생하지 않거나 연결 시도가 실패한 경우 서버의 OnConnected 처리기가 실행될 수 있습니다. 이는 일반적으로 특정 상황에서 발생하는 효과를 나타냅니다. –

+0

참고 용으로 만 사용하십시오. –

관련 문제