made dtoservice synchronous

This commit is contained in:
Luke Pulverenti
2013-09-16 22:44:06 -04:00
parent 1007f24200
commit 85d7eb917f
26 changed files with 226 additions and 187 deletions

View File

@@ -1,6 +1,4 @@
using System.Threading.Tasks;
using MediaBrowser.Common.IO;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Logging;
using System;
using System.Collections.Generic;
using System.Drawing;
@@ -41,7 +39,7 @@ namespace MediaBrowser.Controller.Drawing
/// <param name="logger">The logger.</param>
/// <returns>The dimensions of the specified image.</returns>
/// <exception cref="ArgumentException">The image was of an unrecognised format.</exception>
public static async Task<Size> GetDimensions(string path, ILogger logger)
public static Size GetDimensions(string path, ILogger logger)
{
try
{
@@ -59,11 +57,11 @@ namespace MediaBrowser.Controller.Drawing
}
// Buffer to memory stream to avoid image locking file
using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, StreamDefaults.DefaultFileStreamBufferSize, true))
using (var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
{
using (var memoryStream = new MemoryStream())
{
await fs.CopyToAsync(memoryStream).ConfigureAwait(false);
fs.CopyTo(memoryStream);
// Co it the old fashioned way
using (var b = Image.FromStream(memoryStream, true, false))

View File

@@ -68,11 +68,6 @@ namespace MediaBrowser.Controller.Drawing
private readonly IItemRepository _itemRepo;
/// <summary>
/// The _locks
/// </summary>
private readonly ConcurrentDictionary<string, SemaphoreSlim> _locks = new ConcurrentDictionary<string, SemaphoreSlim>();
/// <summary>
/// Initializes a new instance of the <see cref="ImageManager" /> class.
/// </summary>
@@ -146,7 +141,7 @@ namespace MediaBrowser.Controller.Drawing
}
}
var originalImageSize = await GetImageSize(originalImagePath, dateModified).ConfigureAwait(false);
var originalImageSize = GetImageSize(originalImagePath, dateModified);
// Determine the output size based on incoming parameters
var newSize = DrawingUtils.Resize(originalImageSize, width, height, maxWidth, maxHeight);
@@ -304,7 +299,7 @@ namespace MediaBrowser.Controller.Drawing
/// <param name="dateModified">The date modified.</param>
/// <returns>Task{ImageSize}.</returns>
/// <exception cref="System.ArgumentNullException">imagePath</exception>
public async Task<ImageSize> GetImageSize(string imagePath, DateTime dateModified)
public ImageSize GetImageSize(string imagePath, DateTime dateModified)
{
if (string.IsNullOrEmpty(imagePath))
{
@@ -317,7 +312,7 @@ namespace MediaBrowser.Controller.Drawing
if (!_cachedImagedSizes.TryGetValue(name, out size))
{
size = await GetImageSize(name, imagePath).ConfigureAwait(false);
size = GetImageSize(name, imagePath);
_cachedImagedSizes.AddOrUpdate(name, size, (keyName, oldValue) => size);
}
@@ -333,7 +328,7 @@ namespace MediaBrowser.Controller.Drawing
/// <param name="keyName">Name of the key.</param>
/// <param name="imagePath">The image path.</param>
/// <returns>ImageSize.</returns>
private async Task<ImageSize> GetImageSize(string keyName, string imagePath)
private ImageSize GetImageSize(string keyName, string imagePath)
{
// Now check the file system cache
var fullCachePath = ImageSizeCache.GetResourcePath(keyName, ".txt");
@@ -349,34 +344,29 @@ namespace MediaBrowser.Controller.Drawing
// Cache file doesn't exist or is currently being written to
}
var semaphore = GetLock(fullCachePath);
var syncLock = GetObjectLock(fullCachePath);
await semaphore.WaitAsync().ConfigureAwait(false);
lock (syncLock)
{
try
{
var result = File.ReadAllText(fullCachePath)
.Split('|')
.Select(i => double.Parse(i, UsCulture))
.ToArray();
try
{
var result = File.ReadAllText(fullCachePath).Split('|').Select(i => double.Parse(i, UsCulture)).ToArray();
return new ImageSize { Width = result[0], Height = result[1] };
}
catch (FileNotFoundException)
{
// Cache file doesn't exist no biggie
}
catch (DirectoryNotFoundException)
{
// Cache file doesn't exist no biggie
}
return new ImageSize { Width = result[0], Height = result[1] };
}
catch (FileNotFoundException)
{
// Cache file doesn't exist no biggie
}
catch (DirectoryNotFoundException)
{
// Cache file doesn't exist no biggie
}
catch
{
semaphore.Release();
throw;
}
try
{
var size = await ImageHeader.GetDimensions(imagePath, _logger).ConfigureAwait(false);
var size = ImageHeader.GetDimensions(imagePath, _logger);
var parentPath = Path.GetDirectoryName(fullCachePath);
@@ -390,10 +380,6 @@ namespace MediaBrowser.Controller.Drawing
return new ImageSize { Width = size.Width, Height = size.Height };
}
finally
{
semaphore.Release();
}
}
/// <summary>
@@ -600,7 +586,7 @@ namespace MediaBrowser.Controller.Drawing
return GetEnhancedImage(originalImagePath, dateModified, item, imageType, imageIndex, supportedImageEnhancers);
}
/// <summary>
/// Runs an image through the image enhancers, caches the result, and returns the cached path
/// </summary>
@@ -786,6 +772,11 @@ namespace MediaBrowser.Controller.Drawing
return result;
}
/// <summary>
/// The _semaphoreLocks
/// </summary>
private readonly ConcurrentDictionary<string, SemaphoreSlim> _semaphoreLocks = new ConcurrentDictionary<string, SemaphoreSlim>();
/// <summary>
/// Gets the lock.
/// </summary>
@@ -793,7 +784,22 @@ namespace MediaBrowser.Controller.Drawing
/// <returns>System.Object.</returns>
private SemaphoreSlim GetLock(string filename)
{
return _locks.GetOrAdd(filename, key => new SemaphoreSlim(1, 1));
return _semaphoreLocks.GetOrAdd(filename, key => new SemaphoreSlim(1, 1));
}
/// <summary>
/// The _semaphoreLocks
/// </summary>
private readonly ConcurrentDictionary<string, object> _locks = new ConcurrentDictionary<string, object>();
/// <summary>
/// Gets the lock.
/// </summary>
/// <param name="filename">The filename.</param>
/// <returns>System.Object.</returns>
private object GetObjectLock(string filename)
{
return _locks.GetOrAdd(filename, key => new object());
}
}
}

View File

@@ -6,7 +6,6 @@ using MediaBrowser.Model.Querying;
using MediaBrowser.Model.Session;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace MediaBrowser.Controller.Dto
{
@@ -19,8 +18,8 @@ namespace MediaBrowser.Controller.Dto
/// Gets the user dto.
/// </summary>
/// <param name="user">The user.</param>
/// <returns>Task{UserDto}.</returns>
Task<UserDto> GetUserDto(User user);
/// <returns>UserDto.</returns>
UserDto GetUserDto(User user);
/// <summary>
/// Gets the session info dto.
@@ -66,6 +65,6 @@ namespace MediaBrowser.Controller.Dto
/// <param name="user">The user.</param>
/// <param name="owner">The owner.</param>
/// <returns>Task{BaseItemDto}.</returns>
Task<BaseItemDto> GetBaseItemDto(BaseItem item, List<ItemFields> fields, User user = null, BaseItem owner = null);
BaseItemDto GetBaseItemDto(BaseItem item, List<ItemFields> fields, User user = null, BaseItem owner = null);
}
}