2012-12-05 6 views
2

페이지가로드되면 허브에서 새 작업을 시작합니다. 이 작업은 특정 html 요소를 업데이트하는 브라우저로 데이터를 보냅니다. 내가 페이지를 탐색 할 때 작업을 중단하고 싶습니다.signalR OnDisconnected() 취소 작업

문제는 휴면 인수로 인해 작업이 중지되기 전에이 작업의 이전 인스턴스가 중지되기 전에 새로운 tokenSource = new CancellationTokenSource(); 이 설정된다는 것입니다.

내가하려는 것은 페이지에서 신호를 요구하지 않는 다른 페이지로 이동할 때 작업을 중지시키는 것입니다. 하지만 같은 페이지를 새로 고침하는 경우 중지하지 않아도됩니다. 그것을하는 방법을 모르십시오. 요약하면,이 작업의 인스턴스가 1 개만 실행되도록하고 싶습니다 (그리고/또는 청취자가 필요한 페이지에서만). 모든 정보가 크게 감사하겠습니다. 감사

CODE :이 줄을 이동

public class TaskActionStatus : Hub 
{ 
    #region Static Fields 

    /// <summary> 
    /// The token source. 
    /// </summary> 
    private static CancellationTokenSource tokenSource; 

    /// <summary> 
    /// The url string. 
    /// </summary> 
    private static string url = string.Empty; 

    #endregion 

    #region Public Methods and Operators 

    /// <summary> 
    /// The get tasks status. 
    /// </summary> 
    /// <param name="siteId"> 
    /// The site id. 
    /// </param> 
    /// <param name="location"></param> 
    public void GetTasksStatus(int? siteId) 
    { 
     var taskRepository = UnityContainerSetup.Container.Resolve<ITaskRepository>(); 

     tokenSource = new CancellationTokenSource(); 
     CancellationToken ct = tokenSource.Token; 

     // init task for checking task statuses 
     var tasksItem = new DownloadTaskItem(); 

     // start task only if at least one listener 
     if (UserHandler.ConnectedIds.Count < 2 && !taskRepository.IsTasksStatusAsyncRunning()) 
     { 
      taskRepository.GetTasksStatusAsync(siteId, tasksItem, ct); 

      // subscribe to event [ listener ] 
      tasksItem.Changed += this.UpdateTasksStatus; 
     } 
     else tokenSource.Cancel(); 
    } 

    /// <summary> 
    /// The on connected. 
    /// </summary> 
    /// <returns> 
    /// The <see cref="Task"/>. 
    /// </returns> 
    public override Task OnConnected() 
    { 
     UserHandler.ConnectedIds.Add(this.Context.ConnectionId); 
     return base.OnConnected(); 
    } 

    /// <summary> 
    /// The on disconnected. 
    /// </summary> 
    /// <returns> 
    /// The <see cref="Task"/>. 
    /// </returns> 
    public override Task OnDisconnected() 
    { 
     UserHandler.ConnectedIds.Remove(this.Context.ConnectionId); 
     if (UserHandler.ConnectedIds.Count == 0) 
     { 
      try 
      { 
        tokenSource.Cancel(); 
      } 
      catch (Exception ex) 
      { 
       Log.Error(ex); 
      } 
     } 

     return base.OnDisconnected(); 
    } 

    /// <summary> 
    /// The update tasks status. 
    /// </summary> 
    /// <param name="sender"> 
    /// The sender. 
    /// </param> 
    /// <param name="e"> 
    /// The e. 
    /// </param> 
    public void UpdateTasksStatus(object sender, TaskEventArgs e) 
    { 
     this.Clients.All.updateMessages(e.Tasks); 
    } 

    #endregion 
} 

/// <summary> 
/// The user handler. 
/// </summary> 
public static class UserHandler 
{ 
    #region Static Fields 

    /// <summary> 
    /// The connected ids. 
    /// </summary> 
    public static HashSet<string> ConnectedIds = new HashSet<string>(); 

    #endregion 
} 


    public bool IsTasksStatusAsyncRunning() 
    { 
     if (tasksStatusAsync != null && tasksStatusAsync.Status.Equals(TaskStatus.Running)) 
     { 
      return true; 
     } 

     return false; 
    } 
+0

페이지 새로 고침과 탐색간에 차이점이 없습니다. 자바 스크립트 코드가 더 이상 실행되지 않으므로 둘 다 연결이 끊어집니다. 나는 당신이 OnDisconnected에서 그것을 감지 할 수 있을지 확신하지 못합니다. – davidfowl

답변

2

:

  tokenSource = new CancellationTokenSource(); 
      CancellationToken ct = tokenSource.Token; 

... 그것을 만드는이 :

 if (UserHandler.ConnectedIds.Count < 2) 
     { 
      Trace.WriteLine("GetTasksStatus: Starting new task"); 

      tokenSource = new CancellationTokenSource(); 
      CancellationToken ct = tokenSource.Token; 

      taskRepository.GetTasksStatusAsync(siteId, tasksItem, ct); 

      // subscribe to event [ listener ] 
      tasksItem.Changed += this.UpdateTasksStatus; 
     } 

나를 위해 그것을했다. 감사합니다