private void RunCreateSessionTask(ConnectionDetails connectionDetails, string uri) { Logger.Write(LogLevel.Normal, "Creating OE session"); CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); if (connectionDetails != null && !string.IsNullOrEmpty(uri)) { Task task = CreateSessionAsync(connectionDetails, uri, cancellationTokenSource.Token); CreateSessionTask = task; Task.Run(async() => { ObjectExplorerTaskResult result = await RunTaskWithTimeout(task, settings?.CreateSessionTimeout ?? ObjectExplorerSettings.DefaultCreateSessionTimeout); if (result != null && !result.IsCompleted) { cancellationTokenSource.Cancel(); SessionCreatedParameters response = new SessionCreatedParameters { Success = false, SessionId = uri, ErrorMessage = result.Exception != null ? result.Exception.Message : $"Failed to create session for session id {uri}" }; await serviceHost.SendEvent(CreateSessionCompleteNotification.Type, response); } return(result); }).ContinueWithOnFaulted(null); } }
private async Task <ObjectExplorerTaskResult> RunTaskWithTimeout(Task task, int timeoutInSec) { ObjectExplorerTaskResult result = new ObjectExplorerTaskResult(); TimeSpan timeout = TimeSpan.FromSeconds(timeoutInSec); await Task.WhenAny(task, Task.Delay(timeout)); result.IsCompleted = task.IsCompleted; if (task.Exception != null) { result.Exception = task.Exception; } else if (!task.IsCompleted) { result.Exception = new TimeoutException($"Object Explorer task didn't complete within {timeoutInSec} seconds."); } return(result); }
private void RunExpandTask(ObjectExplorerSession session, ExpandParams expandParams, bool forceRefresh = false) { CancellationTokenSource cancellationTokenSource = new CancellationTokenSource(); Task task = ExpandNodeAsync(session, expandParams, cancellationTokenSource.Token, forceRefresh); ExpandTask = task; Task.Run(async() => { ObjectExplorerTaskResult result = await RunTaskWithTimeout(task, settings?.ExpandTimeout ?? ObjectExplorerSettings.DefaultExpandTimeout); if (result != null && !result.IsCompleted) { cancellationTokenSource.Cancel(); ExpandResponse response = CreateExpandResponse(session, expandParams); response.ErrorMessage = result.Exception != null ? result.Exception.Message: $"Failed to expand node: {expandParams.NodePath} in session {session.Uri}"; await serviceHost.SendEvent(ExpandCompleteNotification.Type, response); } return(result); }).ContinueWithOnFaulted(null); }