Exemplo n.º 1
0
        private async void ServiceDiffCalcRequest()
        {
            // acquire mutually exclusive entry into this method
            serviceDiffCalcRequestLocked = true;

            decimal stars = 0.0M, aim = 0.0M, speed = 0.0M;

            while (completedDiffCalcRequest == null || completedDiffCalcRequest.RequestNumber != diffCalcRequests.Last().RequestNumber)
            {
                completedDiffCalcRequest = diffCalcRequests.Last();
                try
                {
                    (stars, aim, speed) = await Task.Run(() => DifficultyCalculator.CalculateStarRating(NewBeatmap));
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    Console.WriteLine("lol asdfasdf;lkjasdf");
                    (stars, aim, speed) = (0, 0, 0);
                }
                // if a new request came in, invalidate the diffcalc result and service the new request
            }
            // we serviced the last request, so we can commit to the diffcalc result
            StarRating  = stars;
            AimRating   = aim;
            SpeedRating = speed;
            BeatmapModified?.Invoke(this, EventArgs.Empty);

            serviceDiffCalcRequestLocked = false;
        }
Exemplo n.º 2
0
        private async Task <T> GetItemAsync(Uri uri, string fileName, bool throwOnError, bool preCacheOnly)
        {
            T instance = default(T);

            ConcurrentRequest request = null;

            lock (_concurrencyLock)
            {
                if (_concurrentTasks.ContainsKey(fileName))
                {
                    request = _concurrentTasks[fileName];
                }
            }

            // if similar request exists check if it was preCacheOnly and validate that current request isn't preCacheOnly
            if (request != null && request.EnsureCachedCopy && !preCacheOnly)
            {
                await request.Task;
                request = null;
            }

            if (request == null)
            {
                request = new ConcurrentRequest()
                {
                    Task             = GetFromCacheOrDownloadAsync(uri, fileName, preCacheOnly),
                    EnsureCachedCopy = preCacheOnly
                };

                lock (_concurrencyLock)
                {
                    _concurrentTasks.Add(fileName, request);
                }
            }

            try
            {
                instance = await request.Task;
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
                if (throwOnError)
                {
                    throw ex;
                }
            }
            finally
            {
                lock (_concurrencyLock)
                {
                    if (_concurrentTasks.ContainsKey(fileName))
                    {
                        _concurrentTasks.Remove(fileName);
                    }
                }
            }

            return(instance);
        }
        private async Task <T> GetItemAsync(Uri uri, bool throwOnError, bool preCacheOnly, CancellationToken cancellationToken, List <KeyValuePair <string, object> > initializerKeyValues)
        {
            T instance = default(T);

            string fileName = GetCacheFileName(uri);

            ConcurrentRequest request = null;

            _concurrentTasks.TryGetValue(fileName, out request);

            // if similar request exists check if it was preCacheOnly and validate that current request isn't preCacheOnly
            if (request != null && request.EnsureCachedCopy && !preCacheOnly)
            {
                await request.Task.ConfigureAwait(MaintainContext);

                request = null;
            }

            if (request == null)
            {
                request = new ConcurrentRequest()
                {
                    Task             = GetFromCacheOrDownloadAsync(uri, fileName, preCacheOnly, cancellationToken, initializerKeyValues),
                    EnsureCachedCopy = preCacheOnly
                };

                _concurrentTasks[fileName] = request;
            }

            try
            {
                instance = await request.Task.ConfigureAwait(MaintainContext);
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
                if (throwOnError)
                {
                    throw;
                }
            }
            finally
            {
                _concurrentTasks.TryRemove(fileName, out request);
                request = null;
            }

            return(instance);
        }