//private ProjectState State;

        //private Task WriteStateAsync()
        //{
        //	return TaskDone.Done;
        //}

        //private Task ClearStateAsync()
        //{
        //	return TaskDone.Done;
        //}

        public override async Task OnActivateAsync()
        {
            //this.State = new ProjectState();

            await StatsHelper.RegisterActivation("ProjectCodeProviderGrain", this.GrainFactory);

            Logger.OrleansLogger = this.GetLogger();
            Logger.LogInfo(this.GetLogger(), "ProjectGrain", "OnActivate", "Enter");

            // Logger.LogWarning(this.GetLogger(), "ProjectGrain", "OnActivate", "Entering Project: {0}", this.GetPrimaryKeyString());

            this.observers          = new ObserverSubscriptionManager <IEntityGrainObserverNotifications>();
            this.State.AssemblyName = this.GetPrimaryKeyString();

            //Task.Run(async () =>
            //await Task.Factory.StartNew(async () =>
            //{
            try
            {
                this.RaiseStateChangedEvent(EntityGrainStatus.Busy);

                if (!string.IsNullOrEmpty(this.State.ProjectPath))
                {
                    this.projectCodeProvider = await OrleansProjectCodeProvider.CreateFromProjectAsync(this.GrainFactory, this.State.ProjectPath);
                }
                else if (!string.IsNullOrEmpty(this.State.Source) && !String.IsNullOrEmpty(this.State.AssemblyName))
                {
                    this.projectCodeProvider = await OrleansProjectCodeProvider.CreateFromSourceAsync(this.GrainFactory, this.State.Source, this.State.AssemblyName);
                }
                else if (!string.IsNullOrEmpty(this.State.TestName) && !String.IsNullOrEmpty(this.State.AssemblyName))
                {
                    this.projectCodeProvider = await OrleansProjectCodeProvider.CreateFromTestAsync(this.GrainFactory, this.State.TestName, this.State.AssemblyName);
                }
                else if (this.State.AssemblyName.Equals("DUMMY"))
                {
                    this.projectCodeProvider = new OrleansDummyProjectCodeProvider(this.GrainFactory);

                    await this.WriteStateAsync();
                }

                this.RaiseStateChangedEvent(EntityGrainStatus.Ready);
            }
            catch (Exception ex)
            {
                var inner = ex;
                while (inner is AggregateException)
                {
                    inner = inner.InnerException;
                }

                Logger.LogError(this.GetLogger(), "ProjectGrain", "OnActivate", "Error:\n{0}\nInner:\n{1}", ex, inner);
                throw ex;
            }
            //});

            Logger.LogInfo(this.GetLogger(), "ProjectGrain", "OnActivate", "Exit");
        }
        public async Task SetProjectFromTestAsync(string testName)
        {
            await StatsHelper.RegisterMsg("ProjectGrain::SetProjectFromTest", this.GrainFactory);

            Logger.LogVerbose(this.GetLogger(), "ProjectGrain", "SetProjectFromTest", "Enter");

            this.State.TestName     = testName;
            this.State.AssemblyName = TestConstants.ProjectAssemblyName;
            this.State.ProjectPath  = null;
            this.State.Source       = null;

            await this.WriteStateAsync();

            //Task.Run(async () =>
            //await Task.Factory.StartNew(async () =>
            //{
            try
            {
                this.RaiseStateChangedEvent(EntityGrainStatus.Busy);

                this.projectCodeProvider = await OrleansProjectCodeProvider.CreateFromTestAsync(this.GrainFactory, this.State.TestName, this.State.AssemblyName);

                this.RaiseStateChangedEvent(EntityGrainStatus.Ready);
            }
            catch (Exception ex)
            {
                var inner = ex;
                while (inner is AggregateException)
                {
                    inner = inner.InnerException;
                }

                Logger.LogError(this.GetLogger(), "ProjectGrain", "SetProjectFromTest", "Error:\n{0}\nInner:\n{1}", ex, inner);
                throw ex;
            }
            //});

            Logger.LogVerbose(this.GetLogger(), "ProjectGrain", "SetProjectFromTest", "Exit");
        }