private void RemoveClosedTask( TreeTask completeTask ) { long taskHandle = completeTask.Info.Handle; bool executingTasks = false; lock (this._runningTasksLock) { if (this.RunningTasks.ContainsKey(taskHandle)) { TreeTask removedTask; this.RunningTasks.TryRemove(taskHandle, out removedTask); } completeTask.JobChanged -= OnTaskJobChanged; } lock (this._runningTasksLock) { executingTasks = this.RunningTasks.Any(); } this._treeControl.SetInProgress(completeTask.Info, false, executingTasks); }
private void RunningTasksOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs args) { if (args.NewItems != null) { foreach (KeyValuePair <long, TreeTask> ti in args.NewItems) { TreeTask treeTask = ti.Value; treeTask.JobChanged += (s, e) => { string val = null; switch (e.Event) { case TreeJobChangedEvent.WaitingAdded: this.Waiting.TryAdd(e.Job.GetHashCode(), e.Job.Title); break; case TreeJobChangedEvent.WaitingScheduled: this.Waiting.TryRemove(e.Job.GetHashCode(), out val); break; case TreeJobChangedEvent.RunningAdded: this.Running.TryAdd(e.Job.GetHashCode(), e.Job.Title); break; case TreeJobChangedEvent.RunningCompleted: this.Running.TryRemove(e.Job.GetHashCode(), out val); break; default: throw new ArgumentOutOfRangeException(); } RaiseOnChanged(); }; treeTask.Canceled += (o, eventArgs) => { this.IsCancelRequested = true; this.Waiting.Clear(); RaiseOnChanged(); }; } } }
public void EnsureChildrenReady(TreeNode node) { TreeTask treeTask = BeginRefreshTask(node, false, NodeUpdatingSource.FromServerIfNotSavedLocally); if (treeTask != null) { EventWaitHandle alarm = new EventWaitHandle(false, EventResetMode.ManualReset); EventHandler taskCompleteHandler = null; taskCompleteHandler = (sender, args) => { alarm.Set(); treeTask.Completed -= taskCompleteHandler; }; treeTask.Completed += taskCompleteHandler; alarm.WaitOne(); } }
private void RefreshQueries( TreeTask treeTask, ConcreteTemplateNodeDefinition nodeDefinition, ProgressItem progress ) { log.DebugFormat("taskInfo.Connection:'{0}';nodeDefinition:'{1}'", treeTask.Info.Connection.ConnectionGroup.ToString() ?? "?", nodeDefinition.TemplateNode.Name ?? "?" ); ErrorLog errorLog = new ErrorLog(); MsSqlAuditorModel model = this._treeControl._model; DateTime startTime = DateTime.Now; Stopwatch durationWatch = new Stopwatch(); durationWatch.Start(); using (SqlProcessor sqlProcessor = model.GetNewSqlProcessor(treeTask.CancellationSource.Token)) { if (!treeTask.Info.Connection.IsLiveConnection) { sqlProcessor.SetSkipMSSQLQueries(); } progress.SetPromisedChildCount(1); TemplateNodeInfo templateNode = nodeDefinition.TemplateNode; ConnectionGroupInfo group = nodeDefinition.Connection; MultyQueryResultInfo result; if (nodeDefinition.Group.Instance != null) { result = sqlProcessor.ExecuteMultyQuery( nodeDefinition.Group, templateNode.Queries, progress.GetChild() ); } else { result = sqlProcessor.ExecuteMultyQuery( group, templateNode.Queries, progress.GetChild(), model.Settings.SystemSettings.MaximumDBRequestsThreadCount ); } if (group != null && group.Connections != null) { group.Connections.ForEach( x => x.ConnectionGroup = x.ConnectionGroup ?? group ); } errorLog.AppendErrorLog(result); IStorageManager storage = model.GetVaultProcessor(group); storage.SaveRequestedData(templateNode, result); durationWatch.Stop(); DateTime duration = new DateTime(durationWatch.Elapsed.Ticks); storage.CurrentStorage.UpdateTreeNodeTimings( templateNode, startTime, duration ); foreach (GroupDefinition database in result.ExtractDatabases()) { ConcreteTemplateNodeDefinition nodeDef = new ConcreteTemplateNodeDefinition( templateNode, database, group ); this._treeControl.VisualizeData(nodeDef); } } }
private void RefreshNode( TreeTask treeTask, TreeJob parentJob, TreeNode treeNode, ProgressItem progress ) { ConcreteTemplateNodeDefinition nodeDefinition = treeNode.Tag as ConcreteTemplateNodeDefinition; if (treeTask.CancellationSource.IsCancellationRequested) { return; } if (nodeDefinition == null) { return; } TreeJob treeJob = new TreeJob(nodeDefinition); if (parentJob != null) { parentJob.AddChildJob(treeJob); treeJob.Parent = parentJob; } WeakReference treeNodeRef = new WeakReference(treeNode); treeTask.JobCompleted += (sender, args) => { TreeTask task = sender as TreeTask; if (task != null && treeNodeRef.IsAlive) { if (!task.CancellationSource.IsCancellationRequested) { TreeNode targetNode = (TreeNode) treeNodeRef.Target; UpdateTreeCounts(targetNode, task.Info.Mode); } } }; bool refreshChildren = treeTask.Info.Hierarchically; Action refreshNodeAction = () => { try { TemplateNodeInfo templateNode = nodeDefinition.TemplateNode; if (templateNode == null || !nodeDefinition.NodeAvailable) { return; } templateNode.LastUpdateNode = DateTime.Now; CurrentStorage storage = GetStorage(templateNode.ConnectionGroup); templateNode.LoadUserParameters(storage); if (nodeDefinition.NodeActivated) { RefreshQueries(treeTask, nodeDefinition, progress); } if (templateNode.IsLeaf()) { return; } AddLoadingNode(treeNode); templateNode.UpdateChildren(treeTask.Info.Mode, treeTask.CancellationSource); FillTreeNodes(templateNode, treeNode.Nodes); if (refreshChildren) { treeJob.PromisedChildCount = treeNode.Nodes.Count; foreach (TreeNode node in treeNode.Nodes) { if (node != null) { RefreshNode(treeTask, treeJob, node, progress); } } } } catch (Exception exc) { log.Error("MSSQLServerAuditor.Managers:RefreshNode:subTask (Exception)", exc); } }; treeJob.Action = refreshNodeAction; lock (this._schedulingLock) { treeTask.Schedule(treeJob); } }
public TreeTask BeginRefreshTask( TreeNode treeNode, bool hierarchically, NodeUpdatingSource mode, Action continueWith = null ) { if (treeNode == null) { return(null); } ConcreteTemplateNodeDefinition templateDef = treeNode.Tag as ConcreteTemplateNodeDefinition; if (templateDef == null) { log.Debug("MSSQLServerAuditor.TreeTaskManager:BeginRefreshTask templateDef is not defined."); return(null); } long nodeHandle = templateDef.ComputeHandle(); if (this.RunningTasks.ContainsKey(nodeHandle)) { return(null); } ConnectionData connectionData = GetConnectionData(treeNode); TreeTaskInfo taskInfo = new TreeTaskInfo { Connection = connectionData, Mode = mode, Hierarchically = hierarchically, Note = string.Format("{0}", DateTime.Now.ToString("mm:ss")), Handle = nodeHandle }; TreeTask treeTask = TreeTask.Create(taskInfo); if (this._treeControl != null) { treeTask.Progress.ProgressChanged += (sender, args) => this._treeControl.SetProgressValue((int)args.NewValue); } treeTask.Completed += (sender, args) => { Task.Factory.StartNew(() => RemoveClosedTask(treeTask)); if (continueWith != null) { continueWith(); } }; lock (this._runningTasksLock) { this.RunningTasks.TryAdd(taskInfo.Handle, treeTask); } // don't change order of Add and Subscribe! treeTask.JobChanged += OnTaskJobChanged; if (this._treeControl != null) { this._treeControl.SetInProgress(taskInfo, true, true); } ProgressItem progress = new ProgressItem(); RefreshNode(treeTask, null, treeNode, progress); return(treeTask); }
private void RefreshNode( TreeTask treeTask, TreeJob parentJob, TreeNode treeNode, ProgressItem progress ) { ConcreteTemplateNodeDefinition nodeDefinition = treeNode.Tag as ConcreteTemplateNodeDefinition; if (treeTask.CancellationSource.IsCancellationRequested) { return; } if (nodeDefinition == null) { return; } TreeJob treeJob = new TreeJob(nodeDefinition); if (parentJob != null) { parentJob.AddChildJob(treeJob); treeJob.Parent = parentJob; } WeakReference treeNodeRef = new WeakReference(treeNode); treeTask.JobCompleted += (sender, args) => { TreeTask task = sender as TreeTask; if (task != null && treeNodeRef.IsAlive) { if (!task.CancellationSource.IsCancellationRequested) { TreeNode targetNode = (TreeNode)treeNodeRef.Target; UpdateTreeCounts(targetNode, task.Info.Mode); } } }; bool refreshChildren = treeTask.Info.Hierarchically; Action refreshNodeAction = () => { try { TemplateNodeInfo templateNode = nodeDefinition.TemplateNode; if (templateNode == null || !nodeDefinition.NodeAvailable) { return; } templateNode.LastUpdateNode = DateTime.Now; CurrentStorage storage = GetStorage(templateNode.ConnectionGroup); templateNode.LoadUserParameters(storage); if (nodeDefinition.NodeActivated) { RefreshQueries(treeTask, nodeDefinition, progress); } if (templateNode.IsLeaf()) { return; } AddLoadingNode(treeNode); templateNode.UpdateChildren(treeTask.Info.Mode, treeTask.CancellationSource); FillTreeNodes(templateNode, treeNode.Nodes); if (refreshChildren) { treeJob.PromisedChildCount = treeNode.Nodes.Count; foreach (TreeNode node in treeNode.Nodes) { if (node != null) { RefreshNode(treeTask, treeJob, node, progress); } } } } catch (Exception exc) { log.Error("MSSQLServerAuditor.Managers:RefreshNode:subTask (Exception)", exc); } }; treeJob.Action = refreshNodeAction; lock (this._schedulingLock) { treeTask.Schedule(treeJob); } }