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