/// <summary>
        /// Creates the dependency graph asynchronously.
        /// </summary>
        /// <param name="path">The dependency definition file.</param>
        /// <param name="log">The logger to log messages with.</param>
        /// <param name="userCallback">The user callback.</param>
        /// <param name="userState">The state of the user.</param>
        /// <returns>AsyncResult object</returns>
        public IAsyncResult BeginGetDependencyGraph(string path, ILogger log, AsyncCallback userCallback, object userState)
        {
            Logger.Instance().Log(TraceLevel.Info, "Starting asynchronous graph generation ...");
            var asyncResult = new AsyncResult <IGraph>(userCallback, userState);

            ThreadPool.QueueUserWorkItem(o =>
            {
                try
                {
                    var graph = GetDependencyGraph(path, log);
                    asyncResult.SetAsCompleted(graph, false);
                    Logger.Instance().Log(TraceLevel.Info, "Asynchronous graph generation finished successfully");
                }
                catch (Exception ex)
                {
                    var error =
                        new DependencyServiceException(
                            "Error while retrieving the dependency graph: " +
                            ex.Message, ex);
                    asyncResult.SetAsCompleted(error, false);
                    Logger.Instance().Log(TraceLevel.Error, "Asynchronous graph download failed: {0}", ex.Message);
                }
            });

            return(asyncResult);
        }
        /// <summary>
        /// Cleans up the downloaded components asynchronously.
        /// </summary>
        /// <param name="graph">The dependency graph.</param>
        /// <param name="log">The logger to log messages with.</param>
        /// <param name="userCallback">The user callback.</param>
        /// <param name="userState">State of the user.</param>
        /// <returns>IAsyncResult object</returns>
        public IAsyncResult BeginCleanupGraph(IGraph graph, ILogger log, AsyncCallback userCallback, object userState)
        {
            Logger.Instance().Log(TraceLevel.Info, "Starting asynchronous graph cleanup ...");
            var asyncResult = new AsyncResult <bool>(userCallback, userState);

            ThreadPool.QueueUserWorkItem(o =>
            {
                try
                {
                    CleanupGraph(graph, log);
                    asyncResult.SetAsCompleted(true, false);
                    Logger.Instance().Log(TraceLevel.Info, "Asyncronous graph cleanup finished successfully");
                }
                catch (Exception ex)
                {
                    var error =
                        new DependencyServiceException(
                            "Error while cleaning up the dependency graph: " +
                            ex.Message, ex);
                    asyncResult.SetAsCompleted(error, false);
                    Logger.Instance().Log(TraceLevel.Error, "Asynchronous graph cleanup failed: {0}", ex.Message);
                }
            });

            return(asyncResult);
        }