Browse Source

Task.Delay(10) removed from mock services, renderers and View models that could cause potential deadlocks and synchronisation issues, in favour of Task.CompletedTask and Task.FromResult.

pull/651/head
Juan Antonio Cano 6 years ago
parent
commit
0edad8f5e6
10 changed files with 45 additions and 73 deletions
  1. +12
    -16
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketMockService.cs
  2. +10
    -18
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogMockService.cs
  3. +4
    -6
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignMockService.cs
  4. +11
    -15
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/OrderMockService.cs
  5. +2
    -3
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/UserMockService.cs
  6. +3
    -5
      src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs
  7. +1
    -4
      src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Renderers/CustomTabbedPageRenderer.cs
  8. +1
    -1
      src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Mocks/MockSettingsService.cs
  9. +0
    -2
      src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Services/LocationServiceImplementation.cs
  10. +1
    -3
      src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Renderers/CustomTabbedPageRenderer.cs

+ 12
- 16
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketMockService.cs View File

@ -18,52 +18,48 @@ namespace eShopOnContainers.Core.Services.Basket
}
};
public async Task<CustomerBasket> GetBasketAsync(string guidUser, string token)
public Task<CustomerBasket> GetBasketAsync(string guidUser, string token)
{
await Task.Delay(10);
if (string.IsNullOrEmpty(guidUser) || string.IsNullOrEmpty(token))
{
return new CustomerBasket();
return Task.FromResult(new CustomerBasket());
}
return MockCustomBasket;
return Task.FromResult(MockCustomBasket);
}
public async Task<CustomerBasket> UpdateBasketAsync(CustomerBasket customerBasket, string token)
public Task<CustomerBasket> UpdateBasketAsync(CustomerBasket customerBasket, string token)
{
await Task.Delay(10);
if (string.IsNullOrEmpty(token))
{
return new CustomerBasket();
return Task.FromResult(new CustomerBasket());
}
MockCustomBasket = customerBasket;
return MockCustomBasket;
return Task.FromResult(MockCustomBasket);
}
public async Task ClearBasketAsync(string guidUser, string token)
public Task ClearBasketAsync(string guidUser, string token)
{
await Task.Delay(10);
if (string.IsNullOrEmpty(token))
{
return;
return Task.CompletedTask;
}
if (!string.IsNullOrEmpty(guidUser))
{
MockCustomBasket.Items.Clear();
}
return Task.CompletedTask;
}
public Task CheckoutAsync(BasketCheckout basketCheckout, string token)
{
if (string.IsNullOrEmpty(token))
{
return Task.FromResult(0);
return Task.CompletedTask;
}
if (basketCheckout != null)
@ -71,7 +67,7 @@ namespace eShopOnContainers.Core.Services.Basket
MockCustomBasket.Items.Clear();
}
return Task.FromResult(0);
return Task.CompletedTask;
}
}
}

+ 10
- 18
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Catalog/CatalogMockService.cs View File

@ -31,35 +31,27 @@ namespace eShopOnContainers.Core.Services.Catalog
new CatalogItem { Id = Common.Common.MockCatalogItemId05, PictureUri = Device.RuntimePlatform != Device.UWP ? "fake_product_05.png" : "Assets/fake_product_05.png", Name = "Azure Black Sweatshirt (M)", Price = 19.50M, CatalogBrandId = 1, CatalogBrand = "Azure", CatalogTypeId = 2, CatalogType = "T-Shirt" }
};
public async Task<ObservableCollection<CatalogItem>> GetCatalogAsync()
public Task<ObservableCollection<CatalogItem>> GetCatalogAsync()
{
await Task.Delay(10);
return MockCatalog;
return Task.FromResult(MockCatalog);
}
public async Task<ObservableCollection<CatalogItem>> FilterAsync(int catalogBrandId, int catalogTypeId)
public Task<ObservableCollection<CatalogItem>> FilterAsync(int catalogBrandId, int catalogTypeId)
{
await Task.Delay(10);
return MockCatalog
return Task.FromResult(MockCatalog
.Where(c => c.CatalogBrandId == catalogBrandId &&
c.CatalogTypeId == catalogTypeId)
.ToObservableCollection();
.ToObservableCollection());
}
public async Task<ObservableCollection<CatalogBrand>> GetCatalogBrandAsync()
public Task<ObservableCollection<CatalogBrand>> GetCatalogBrandAsync()
{
await Task.Delay(10);
return MockCatalogBrand;
return Task.FromResult(MockCatalogBrand);
}
public async Task<ObservableCollection<CatalogType>> GetCatalogTypeAsync()
{
await Task.Delay(10);
return MockCatalogType;
public Task<ObservableCollection<CatalogType>> GetCatalogTypeAsync()
{
return Task.FromResult(MockCatalogType);
}
}
}

+ 4
- 6
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Marketing/CampaignMockService.cs View File

@ -36,16 +36,14 @@ namespace eShopOnContainers.Core.Services.Marketing
}
};
public async Task<ObservableCollection<CampaignItem>> GetAllCampaignsAsync(string token)
public Task<ObservableCollection<CampaignItem>> GetAllCampaignsAsync(string token)
{
await Task.Delay(10);
return _mockCampaign;
return Task.FromResult(_mockCampaign);
}
public async Task<CampaignItem> GetCampaignByIdAsync(int campaignId, string token)
public Task<CampaignItem> GetCampaignByIdAsync(int campaignId, string token)
{
await Task.Delay(10);
return _mockCampaign.SingleOrDefault(c => c.Id == campaignId);
return Task.FromResult(_mockCampaign.SingleOrDefault(c => c.Id == campaignId));
}
}
}

+ 11
- 15
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Order/OrderMockService.cs View File

@ -72,39 +72,35 @@ namespace eShopOnContainers.Core.Services.Order
Street = "FakeStreet"
};
public async Task<ObservableCollection<Models.Orders.Order>> GetOrdersAsync(string token)
public Task<ObservableCollection<Models.Orders.Order>> GetOrdersAsync(string token)
{
await Task.Delay(10);
if (!string.IsNullOrEmpty(token))
{
return MockOrders
return Task.FromResult(MockOrders
.OrderByDescending(o => o.OrderNumber)
.ToObservableCollection();
.ToObservableCollection());
}
else
return new ObservableCollection<Models.Orders.Order>();
return Task.FromResult(new ObservableCollection<Models.Orders.Order>());
}
public async Task<Models.Orders.Order> GetOrderAsync(int orderId, string token)
public Task<Models.Orders.Order> GetOrderAsync(int orderId, string token)
{
await Task.Delay(10);
if (!string.IsNullOrEmpty(token))
return MockOrders
.FirstOrDefault(o => o.OrderNumber.Equals(orderId));
return Task.FromResult(MockOrders
.FirstOrDefault(o => o.OrderNumber.Equals(orderId)));
else
return new Models.Orders.Order();
return Task.FromResult(new Models.Orders.Order());
}
public async Task CreateOrderAsync(Models.Orders.Order newOrder, string token)
public Task CreateOrderAsync(Models.Orders.Order newOrder, string token)
{
await Task.Delay(10);
if (!string.IsNullOrEmpty(token))
{
MockOrders.Add(newOrder);
}
return Task.CompletedTask;
}
public BasketCheckout MapOrderToBasket(Models.Orders.Order order)


+ 2
- 3
src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/UserMockService.cs View File

@ -26,10 +26,9 @@ namespace eShopOnContainers.Core.Services.User
CardSecurityNumber = "1234"
};
public async Task<UserInfo> GetUserInfoAsync(string authToken)
public Task<UserInfo> GetUserInfoAsync(string authToken)
{
await Task.Delay(10);
return MockUserInfo;
return Task.FromResult(MockUserInfo);
}
}
}

+ 3
- 5
src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs View File

@ -160,8 +160,6 @@ namespace eShopOnContainers.Core.ViewModels
{
try
{
await Task.Delay(10);
isAuthenticated = true;
}
catch (Exception ex)
@ -185,17 +183,17 @@ namespace eShopOnContainers.Core.ViewModels
IsBusy = false;
}
private async Task SignInAsync()
private Task SignInAsync()
{
IsBusy = true;
await Task.Delay(10);
LoginUrl = _identityService.CreateAuthorizationRequest();
IsValid = true;
IsLogin = true;
IsBusy = false;
return Task.CompletedTask;
}
private void Register()


+ 1
- 4
src/Mobile/eShopOnContainers/eShopOnContainers.Droid/Renderers/CustomTabbedPageRenderer.cs View File

@ -19,7 +19,6 @@ namespace eShopOnContainers.Droid.Renderers
{
public class CustomTabbedPageRenderer : TabbedPageRenderer
{
private const int DelayBeforeTabAdded = 10;
protected readonly Dictionary<Element, BadgeView> BadgeViews = new Dictionary<Element, BadgeView>();
private TabLayout _tabLayout;
private LinearLayout _tabStrip;
@ -186,10 +185,8 @@ namespace eShopOnContainers.Droid.Renderers
BadgeViews.Remove(e.Element);
}
private async void OnTabAdded(object sender, ElementEventArgs e)
private void OnTabAdded(object sender, ElementEventArgs e)
{
await Task.Delay(DelayBeforeTabAdded);
var page = e.Element as Page;
if (page == null)


+ 1
- 1
src/Mobile/eShopOnContainers/eShopOnContainers.UnitTests/Mocks/MockSettingsService.cs View File

@ -86,7 +86,7 @@ namespace eShopOnContainers.UnitTests.Mocks
}
_settings[key] = value;
return Task.Delay(10);
return Task.FromResult(false);
}
T GetValueOrDefaultInternal<T>(string key, T defaultValue = default(T))


+ 0
- 2
src/Mobile/eShopOnContainers/eShopOnContainers.Windows/Services/LocationServiceImplementation.cs View File

@ -64,7 +64,6 @@ namespace eShopOnContainers.Windows.Services
var status = _locator.LocationStatus;
while (status == PositionStatus.Initializing)
{
Task.Delay(10).Wait();
status = _locator.LocationStatus;
}
return status != PositionStatus.NotAvailable;
@ -78,7 +77,6 @@ namespace eShopOnContainers.Windows.Services
var status = _locator.LocationStatus;
while (status == PositionStatus.Initializing)
{
Task.Delay(10).Wait();
status = _locator.LocationStatus;
}
return status != PositionStatus.Disabled && status != PositionStatus.NotAvailable;


+ 1
- 3
src/Mobile/eShopOnContainers/eShopOnContainers.iOS/Renderers/CustomTabbedPageRenderer.cs View File

@ -74,10 +74,8 @@ namespace eShopOnContainers.iOS.Renderers
}
}
private async void OnTabAdded(object sender, ElementEventArgs e)
private void OnTabAdded(object sender, ElementEventArgs e)
{
await Task.Delay(10);
var page = e.Element as Page;
if (page == null)
return;


Loading…
Cancel
Save