예제 #1
0
        /// <summary>
        /// Sets the left.
        /// </summary>
        /// <param name="definition">The definition.</param>
        public void SetLeft(IDefinition definition)
        {
            async Task parseImage()
            {
                var mutex = await leftImageLock.LockAsync();

                var left = LeftImage;

                if (definition != null)
                {
                    LeftImageInfo = string.Empty;
                    LeftImage     = null;
                    left?.Dispose();
                    LeftHeight   = LeftWidth = 0;
                    using var ms = await modService.GetImageStreamAsync(definition?.ModName, definition?.File);

                    if (ms != null)
                    {
                        try
                        {
                            LeftImage = new Bitmap(ms);
                            var imageHeight = (LeftImage?.PixelSize.Width).GetValueOrDefault();
                            var imageWidth  = (LeftImage?.PixelSize.Height).GetValueOrDefault();
                            var info        = localizationManager.GetResource(LocalizationResources.Conflict_Solver.ImageInfo);
                            LeftImageInfo = Smart.Format(info, new { Width = imageWidth, Height = imageHeight });
                            LeftHeight    = imageHeight;
                            LeftWidth     = imageWidth;
                        }
                        catch (Exception ex)
                        {
                            logger.Error(ex);
                            LeftImageInfo = string.Empty;
                            LeftImage     = null;
                            left?.Dispose();
                            LeftHeight = LeftWidth = 0;
                        }
                    }
                }
                else
                {
                    LeftImageInfo = string.Empty;
                    LeftImage     = null;
                    left?.Dispose();
                    LeftHeight = LeftWidth = 0;
                }
                await Task.Delay(10);

                mutex.Dispose();
            }

            Task.Run(() => parseImage().ConfigureAwait(false)).ConfigureAwait(false);
        }
        /// <summary>
        /// Sets the left.
        /// </summary>
        /// <param name="definition">The definition.</param>
        public void SetLeft(IDefinition definition)
        {
            var loadingImage = false;

            async Task loadImage()
            {
                while (loadingImage)
                {
                    await Task.Delay(25);
                }
                loadingImage  = true;
                LeftImageInfo = string.Empty;
                var left = LeftImage;

                LeftImage = null;
                left?.Dispose();
                using var ms = await modService.GetImageStreamAsync(definition?.ModName, definition?.File);

                if (ms != null)
                {
                    LeftImage = new Bitmap(ms);
                    var info = localizationManager.GetResource(LocalizationResources.Conflict_Solver.ImageInfo);
                    LeftImageInfo = Smart.Format(info, new { LeftImage.PixelSize.Width, LeftImage.PixelSize.Height });
                }
                loadingImage = false;
            }

            if (definition != null)
            {
                Task.Run(() => loadImage().ConfigureAwait(false)).ConfigureAwait(false);
            }
            else
            {
                LeftImageInfo = string.Empty;
                var left = LeftImage;
                LeftImage = null;
                left?.Dispose();
            }
        }
        /// <summary>
        /// load images as an asynchronous operation.
        /// </summary>
        protected virtual async Task LoadImagesAsync()
        {
            while (loadingImages)
            {
                await Task.Delay(25);
            }
            loadingImages = true;
            if (prevLeftDefinition != LeftDefinition)
            {
                LeftImageInfo = string.Empty;
                var left = LeftImage;
                LeftImage = null;
                left?.Dispose();
                using var ms = await modService.GetImageStreamAsync(LeftDefinition?.ModName, LeftDefinition?.File);

                if (ms != null)
                {
                    LeftImage = new Bitmap(ms);
                    var info = localizationManager.GetResource(LocalizationResources.Conflict_Solver.ImageInfo);
                    LeftImageInfo = Smart.Format(info, new { LeftImage.PixelSize.Width, LeftImage.PixelSize.Height });
                }
            }
            if (prevRightDefinition != RightDefinition)
            {
                RightImageInfo = string.Empty;
                var right = RightImage;
                RightImage = null;
                right?.Dispose();
                using var ms = await modService.GetImageStreamAsync(RightDefinition?.ModName, RightDefinition?.File);

                if (ms != null)
                {
                    RightImage = new Bitmap(ms);
                    var info = localizationManager.GetResource(LocalizationResources.Conflict_Solver.ImageInfo);
                    RightImageInfo = Smart.Format(info, new { RightImage.PixelSize.Width, RightImage.PixelSize.Height });
                }
            }
            loadingImages = false;
        }
        /// <summary>
        /// Get bitmap as an asynchronous operation.
        /// </summary>
        /// <param name="definition">The definition.</param>
        /// <returns>A Task&lt;IBitmap&gt; representing the asynchronous operation.</returns>
        protected virtual async Task <IBitmap> GetBitmapAsync(IDefinition definition)
        {
            IBitmap bitmap = null;
            var     key    = ConstructImageCacheKey(definition);

            if (imageCache.Contains(key))
            {
                bitmap = imageCache[key];
            }
            else
            {
                using var ms = await modService.GetImageStreamAsync(definition.ModName, definition.File, definition.IsFromGame);

                if (ms != null)
                {
                    bitmap = new Bitmap(ms);
                    imageCache.Add(key, bitmap);
                }
            }
            return(bitmap);
        }