예제 #1
0
 public void AddChildJob(TreeJob child)
 {
     lock (this._syncObj)
     {
         this._childJobs.Add(child);
     }
 }
예제 #2
0
		public bool RemoveChildJob(TreeJob child)
		{
			lock (this._syncObj)
			{
				return this._childJobs.Remove(child);
			}
		}
예제 #3
0
        private bool CheckOnJobCompleted(TreeJob treeJob)
        {
            if (treeJob.State != TreeJobState.Completed)
            {
                return(false);
            }

            bool childrenCompleted = true;

            foreach (TreeJob childJob in treeJob.ChildJobs)
            {
                bool childCompleted = CheckOnJobCompleted(childJob);

                if (childCompleted)
                {
                    treeJob.RemoveChildJob(childJob);
                }

                childrenCompleted &= childCompleted;
            }

            if (childrenCompleted)
            {
                TreeJob parentJob = treeJob.Parent;

                if (parentJob != null)
                {
                    parentJob.RemoveChildJob(treeJob);
                    OnJobCompleted(parentJob);
                }
            }

            return(childrenCompleted);
        }
예제 #4
0
 private void OnJobChanged(TreeJob treeJob, TreeJobChangedEvent args)
 {
     if (JobChanged != null)
     {
         JobChanged(this, new TreeJobChangedEventArgs(treeJob, args));
     }
 }
예제 #5
0
		public void AddChildJob(TreeJob child)
		{
			lock (this._syncObj)
			{
				this._childJobs.Add(child);
			}
		}
예제 #6
0
 public bool RemoveChildJob(TreeJob child)
 {
     lock (this._syncObj)
     {
         return(this._childJobs.Remove(child));
     }
 }
예제 #7
0
 private void OnJobCompleted(TreeJob treeJob)
 {
     if (CheckOnJobCompleted(treeJob))
     {
         if (JobCompleted != null)
         {
             JobCompleted(this, new TreeJobCompletedEventArgs(treeJob));
         }
     }
 }
예제 #8
0
        public void Schedule(TreeJob treeJob)
        {
            if (this.CancellationSource.IsCancellationRequested)
            {
                return;
            }

            if (this._threadCounter.CanAdd)
            {
                Execute(treeJob);
            }
            else
            {
                if (!this.CancellationSource.IsCancellationRequested)
                {
                    this._waitingJobs.Enqueue(treeJob);
                    OnJobChanged(treeJob, TreeJobChangedEvent.WaitingAdded);
                }
            }
        }
예제 #9
0
		public void Schedule(TreeJob treeJob)
		{
			if (this.CancellationSource.IsCancellationRequested)
			{
				return;
			}

			if (this._threadCounter.CanAdd)
			{
				Execute(treeJob);
			}
			else
			{
				if (!this.CancellationSource.IsCancellationRequested)
				{
					this._waitingJobs.Enqueue(treeJob);
					OnJobChanged(treeJob, TreeJobChangedEvent.WaitingAdded);
				}
			}
		}
예제 #10
0
        private void Execute(TreeJob treeJob)
        {
            lock (this._runningJobsLock)
            {
                this._threadCounter.Increment();

                treeJob.State = TreeJobState.Running;
                this._runningJobs.Add(treeJob);
                OnJobChanged(treeJob, TreeJobChangedEvent.RunningAdded);
            }

            Task.Factory.StartNew(treeJob.Action)
            .ContinueWith(t =>
            {
                lock (this._runningJobsLock)
                {
                    this._runningJobs.Remove(treeJob);
                }

                treeJob.State = TreeJobState.Completed;
                OnJobCompleted(treeJob);

                Progress.AddItems(treeJob.PromisedChildCount);

                Progress.CompleteItems(1);
                this._threadCounter.Decrement();

                OnJobChanged(treeJob, TreeJobChangedEvent.RunningCompleted);

                CheckOnCompleted();
            })
            .ContinueOnException(t =>
            {
                if (t.Exception != null)
                {
                    log.ErrorFormat("Error occurred while processing task completion: {0}", t.Exception);
                }
            });
        }
예제 #11
0
		private void OnJobChanged(TreeJob treeJob, TreeJobChangedEvent args)
		{
			if (JobChanged != null)
			{
				JobChanged(this, new TreeJobChangedEventArgs(treeJob, args));
			}
		}
예제 #12
0
 public TreeJobChangedEventArgs(TreeJob job, TreeJobChangedEvent jobEvent)
 {
     this.Job   = job;
     this.Event = jobEvent;
 }
예제 #13
0
 public TreeJobCompletedEventArgs(TreeJob job)
 {
     this.Job = job;
 }
		public TreeJobChangedEventArgs(TreeJob job, TreeJobChangedEvent jobEvent)
		{
			this.Job   = job;
			this.Event = jobEvent;
		}
예제 #15
0
		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);
			}
		}
예제 #16
0
        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);
            }
        }
예제 #17
0
		private void Execute(TreeJob treeJob)
		{
			lock (this._runningJobsLock)
			{
				this._threadCounter.Increment();

				treeJob.State = TreeJobState.Running;
				this._runningJobs.Add(treeJob);
				OnJobChanged(treeJob, TreeJobChangedEvent.RunningAdded);
			}

			Task.Factory.StartNew(treeJob.Action)
				.ContinueWith(t =>
				{
					lock (this._runningJobsLock)
					{
						this._runningJobs.Remove(treeJob);
					}

					treeJob.State = TreeJobState.Completed;
					OnJobCompleted(treeJob);

					Progress.AddItems(treeJob.PromisedChildCount);

					Progress.CompleteItems(1);
					this._threadCounter.Decrement();

					OnJobChanged(treeJob, TreeJobChangedEvent.RunningCompleted);

					CheckOnCompleted();
				})
				.ContinueOnException(t =>
				{
					if (t.Exception != null)
					{
						log.ErrorFormat("Error occurred while processing task completion: {0}", t.Exception);
					}
				});
		}
		public TreeJobCompletedEventArgs(TreeJob job)
		{
			this.Job = job;
		}
예제 #19
0
		private bool CheckOnJobCompleted(TreeJob treeJob)
		{
			if (treeJob.State != TreeJobState.Completed)
			{
				return false;
			}

			bool childrenCompleted = true;

			foreach (TreeJob childJob in treeJob.ChildJobs)
			{
				bool childCompleted = CheckOnJobCompleted(childJob);

				if (childCompleted)
				{
					treeJob.RemoveChildJob(childJob);
				}

				childrenCompleted &= childCompleted;
			}

			if (childrenCompleted)
			{
				TreeJob parentJob = treeJob.Parent;

				if (parentJob != null)
				{
					parentJob.RemoveChildJob(treeJob);
					OnJobCompleted(parentJob);
				}
			}

			return childrenCompleted;
		}
예제 #20
0
		private void OnJobCompleted(TreeJob treeJob)
		{
			if (CheckOnJobCompleted(treeJob))
			{
				if (JobCompleted != null)
				{
					JobCompleted(this, new TreeJobCompletedEventArgs(treeJob));
				}
			}
		}