public void AnalyzeEntireSolutionAsync()
        {
			foreach (var project in this.Solution.Projects)
			{
				var compilation = project.GetCompilationAsync().Result;
				var diag = compilation.GetDiagnostics();

				var theAssembly = compilation.Assembly;

				var continuations = new List<Task>();
				foreach (var tree in compilation.SyntaxTrees)
				{
					var provider = new ProjectCodeProvider(project, compilation);
                    var model = compilation.GetSemanticModel(tree);
                    var allMethodsVisitor = new AllMethodsVisitor(model, tree, this.Dispatcher);
					continuations.Add(allMethodsVisitor.Run(tree));
				}
				Task.WhenAll(continuations);
			}
            //if (this.Dispatcher is QueueingDispatcher)
            //{
            //    var qd = (QueueingDispatcher)this.Dispatcher;
            //    while (!qd.IsDoneProcessing)
            //    {
            //        Logger.Instance.Log("Waiting for the queue to empty up...");
            //        Thread.Sleep(1000);
            //    }
            //}

            /*
            if (mainMethod != null)
            {
                var methodDescriptor = new MethodDescriptor(mainMethod);
                callgraph.AddRootMethod(methodDescriptor);

                var mainMethodEntityDescriptor = new MethodEntityDescriptor<AMethod>(new AMethod(mainMethod));
                var mainEntityProcessor = this.Dispatcher.GetEntityWithProcessor(mainMethodEntityDescriptor) as MethodEntityProcessor<ANode,AType,AMethod>;
                
                // Just a test
                //mainEntityProcessor.MethodEntity.CurrentContext = new CallConext<AMethod, ANode>(mainEntityProcessor.MethodEntity.Method, null, null);
                
                var task = mainEntityProcessor.DoAnalysisAsync();
                task.Start();
                task.Wait();

                //var methodEntity = (MethodEntity<ANode, AType, AMethod>)mainEntityProcessor.Entity;
                var methodEntity = mainEntityProcessor.MethodEntity;
                Thread.Sleep(10);

                //if (this.Dispatcher is AsyncDispatcher)
                //{
                //    while (!mainEntityProcessor.HasFinishedAllProgatations())
                //    {
                //        Logger.Instance.Log("Waiting in Main for the queue to empty up... {0}",mainEntityProcessor.MethodEntity.NodesProcessing.Count());
                //        Thread.Sleep(10);
                //    }
                //}
                GenerateCallGraph();
            }*/
        }
        public void AnalyzeEntireSolution()
        {
			foreach (var project in this.Solution.Projects)
			{
				var compilation = project.GetCompilationAsync().Result;
				var diag = compilation.GetDiagnostics();

				var theAssembly = compilation.Assembly;

				foreach (var tree in compilation.SyntaxTrees)
				{
                    var model = compilation.GetSemanticModel(tree);
					var codeProvider = new ProjectCodeProvider(project, compilation);
					var allMethodsVisitor = new AllMethodsVisitor(model, tree, this.Dispatcher);
					allMethodsVisitor.Visit(tree.GetRoot());
				}
			}
            //if (this.Dispatcher is QueueingDispatcher)
            //{
            //    var qd = (QueueingDispatcher)this.Dispatcher;
            //    while (!qd.IsDoneProcessing)
            //    {
            //        Logger.Instance.Log("Waiting for the queue to empty up...");
            //        Thread.Sleep(1000);
            //    }
            //}

            /*
            if (mainMethod != null)
            {
                var methodDescriptor = new MethodDescriptor(mainMethod);
                callgraph.AddRootMethod(methodDescriptor);

				var mainMethodEntityDescriptor = new MethodEntityDescriptor<AMethod>(new AMethod(mainMethod));
				var mainEntityProcessor = this.Dispatcher.GetEntityWithProcessor(mainMethodEntityDescriptor);

				mainEntityProcessor.DoAnalysis();
				GenerateCallGraph();
            }*/
        }