public static void SetAppInfo(AppInfoEx appInfo)
        {
            var storingInfo = GetAppInfo(appInfo.Hash);

            if (storingInfo != null)
            {
                storingInfo.Status = appInfo.Status;
                storingInfo.Time   = appInfo.Time;
            }
            else
            {
                AppInfoArray appInfoArray = null;
                if (_appInfo.TryGetValue(appInfo.Name, out appInfoArray))
                {
                    appInfoArray.Add(appInfo);
                }
                else
                {
                    appInfoArray = new AppInfoArray();
                    appInfoArray.Add(appInfo);
                    _appInfo.Add(appInfo.Name, appInfoArray);
                }
                _appHash.Add(appInfo.Hash, appInfo);
            }
        }
        public static AppInfoEx GetAppInfo(string appName, string url)
        {
            AppInfoEx    appInfo      = null;
            AppInfoArray appInfoArray = null;

            if (_appInfo.TryGetValue(appName, out appInfoArray))
            {
                appInfo = appInfoArray.Find(x => x.Url == url);
            }
            return(appInfo);
        }
        public static string GetOptimalUrl(string appName)
        {
            AppInfoArray appInfoArray = null;

            if (_appInfo.TryGetValue(appName, out appInfoArray))
            {
                var filteredValues = appInfoArray.FindAll(item => item.Status == Contracts.AppStatus.Started);
                filteredValues.Sort(delegate(AppInfoEx first, AppInfoEx second)
                {
                    return(first.Weight - second.Weight);
                });
                return((filteredValues.Count > 0) ? filteredValues[0].Url : "");
            }
            return("");
        }