public override async Task<State> Poll()
        {
            bool running = await Task.Run(async () => {    

                await Task.Delay(0);
                return IsRunning();
            });

            _state = new State() { Url = string.Concat(this.ServiceName, "@", this.Server.Name) };
            if (!running)//need to move this code out of here
            {
                this.Restart();
                if (!IsRunning())
                {
                    _state.Status =_unableToRestartMessage ;
                }
                else
                {
                    _state.Status = _stopedButRestartedMessage ;
                }
            }
            else
            {
                _state.Status = "OK";
            }

            return _state;
        }
       public async Task<State> PollAsync()
       {
          
                State state = new State();
                state = await Resource.Poll();

           return state;
       }
 public override async Task<State> Poll()
 {
     var ping = new Ping();
     var data = "B".PadRight(32, 'B');
     var buffer = Encoding.ASCII.GetBytes(data);
     PingReply reply = await ping.SendPingAsync(ServerName, pingTimeout , buffer, new PingOptions(128,true));
     
     _state = new State();
     _state.Url = string.Concat(this.Name, "-", reply.Address.ToString());
     _state.Status = reply.Status == IPStatus.Success ? "OK" : GetPingMessage(reply);
     return _state;
 }
       public override async Task<State> Poll()
       {
           HttpResponseMessage response;
            using (var handler = new HttpClientHandler { UseDefaultCredentials = true })
            using (var client = new HttpClient(handler)){

               client.DefaultRequestHeaders.Accept.Clear();
               client.Timeout = TimeSpan.FromSeconds(100);
               response = await client.GetAsync(this.Url,HttpCompletionOption.ResponseHeadersRead);
                
               if(response.StatusCode == System.Net.HttpStatusCode.Unauthorized)
                {
                    response = await client.GetAsync(this.Url,HttpCompletionOption.ResponseHeadersRead);
                    
                }
                _state = new State() { Status = response.StatusCode.ToString(), Url = this.Url };
            }
           return _state;
       }
        public override async Task<State> Poll()
        {
  
            ServerManager server = null;
            ObjectState stateResult = ObjectState.Unknown;
            State state = default(State);
            try
            {
               
               server = ServerManager.OpenRemote(serverInstance.Name) ;
                    if (server != null&& this.Exist())
                    {
                    state = new State();
                    state.Url = string.Concat(this.Name, "@", serverInstance.Name);
                    stateResult = server.ApplicationPools[Name].State;

                    if (stateResult == ObjectState.Started) {

                        if (server.ApplicationPools[Name].WorkerProcesses.Count > 0)
                        {
                            WorkerProcess wp = server.ApplicationPools[Name].WorkerProcesses
                                .Where(p => p
                                .AppPoolName.ToLowerInvariant() == Name.ToLowerInvariant())
                                .FirstOrDefault();

                            PerformanceCounter cpuCounter = new PerformanceCounter("Process"
                                  , "% Processor Time"
                                  , Process.GetProcessById(wp.ProcessId, serverInstance.Name).ProcessName
                                  , serverInstance.Name);

                            cpuPercent = cpuCounter.NextValue();
                            await Task.Delay(2000);
                            cpuPercent = cpuCounter.NextValue();
                            await Task.Delay(30000);


                            //the requests interval time is now 30000
                            int numOfRequests = wp.GetRequests(30000).Count;


                            float cpuPercentAfterThirthySeconds = cpuCounter.NextValue();

                            if (cpuPercent >= _cpuAlertTreshold && cpuPercentAfterThirthySeconds >= _cpuAlertTreshold)
                            {
                                state.Status = "High CPU Load";
                                state.Description =string.Format("The CPU for app pool {0} on {1} has reach {2}% and may cause HTTP 503 errors", Name, serverInstance.Name, cpuPercent);
                                state = GetCommonState(server, state, numOfRequests);
                            }
                            else
                            {
                                state.Status = _positiveStatusCode;

                            }

                            if (!string.IsNullOrEmpty(state.Status))
                            {
                                server.Dispose();
                                cpuCounter.Close();
                                cpuCounter.Dispose();
                            }
                        }
                        else
                        {
                            state.Status = _positiveStatusCode;

                        }

                        return state;
                        



                        } 
                    else
                    {
                        state.Description = stateResult == ObjectState.Started ? string.Format("The app pool on server {0} is in the following in {1} state, the number of worker processes is {2}", serverInstance.Name, stateResult.ToString(), server.ApplicationPools[Name].WorkerProcesses.Count) : "Unavailable";
                        state.Status = stateResult == ObjectState.Started ? _positiveStatusCode: "App Pool Not Started";

                        state = GetCommonState(server, state, 0);
                        if (stateResult == ObjectState.Stopped)
                        {
                            server.ApplicationPools[Name].Start();
                            state.Description += server.ApplicationPools[Name].State == ObjectState.Started ? "\rResolution: The appPool was started" : state.Description;
                        }


                    }


                }
                

            }
            catch(Exception ex)
            {
                state.Status = ex.GetType().Name;
                state.Description = "'polling failed with" + ex.Message;
                state.Url = string.Concat(this.Name, "@", serverInstance.Name);
                return state;
            }
            

            return state;
            
        }
 private State GetCommonState(ServerManager server, State state, int numOfRequests)
 {
     StringBuilder builder = new StringBuilder();
     builder.AppendLine(state.Status);
     state.Status = builder.ToString();
     return state;
 }
 public static void Print(State t, string taskStatus)
 {
     Console.WriteLine("|");
     Console.WriteLine("--{0} : {1} - {2} \n{3}", taskStatus, t.Url, t.Status, t.Description);
 }
 private static void Print(State state , string taskStatus)
 {
     StateLogger.Print(state, taskStatus);
 }