Skip to content

Commit

Permalink
MarimerLLC#1059 Add SyncTask and use in HttpProxy for sync operations
Browse files Browse the repository at this point in the history
  • Loading branch information
rockfordlhotka committed Apr 2, 2019
1 parent bb1ce66 commit 23904c9
Show file tree
Hide file tree
Showing 3 changed files with 53 additions and 12 deletions.
1 change: 1 addition & 0 deletions Source/Csla.Shared/Csla.Shared.projitems
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,7 @@
<Compile Include="$(MSBuildThisFileDirectory)Threading\BusyLock.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Threading\ContextParams.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Threading\CslaTaskScheduler.cs" />
<Compile Include="$(MSBuildThisFileDirectory)Threading\SyncTask.cs" />
<Compile Include="$(MSBuildThisFileDirectory)TransactionalAttribute.cs" />
<Compile Include="$(MSBuildThisFileDirectory)TransactionalTypes.cs" />
<Compile Include="$(MSBuildThisFileDirectory)TransactionIsolationLevel.cs" />
Expand Down
26 changes: 14 additions & 12 deletions Source/Csla.Shared/DataPortalClient/HttpProxy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -185,8 +185,6 @@ public async Task<DataPortalResult> Create(Type objectType, object criteria, Dat
DataPortalResult result = null;
try
{
if (isSync)
throw new NotSupportedException("isSync == true");
var client = GetClient();
var request = GetBaseCriteriaRequest();
request.TypeName = AssemblyNameTranslator.GetAssemblyQualifiedName(objectType.AssemblyQualifiedName);
Expand All @@ -199,7 +197,7 @@ public async Task<DataPortalResult> Create(Type objectType, object criteria, Dat

var serialized = MobileFormatter.Serialize(request);

serialized = await CallDataPortalServer(client, serialized, "create", GetRoutingToken(objectType));
serialized = await CallDataPortalServer(client, serialized, "create", GetRoutingToken(objectType), isSync);

var response = (Csla.Server.Hosts.HttpChannel.HttpResponse)MobileFormatter.Deserialize(serialized);
response = ConvertResponse(response);
Expand Down Expand Up @@ -245,8 +243,6 @@ public async Task<DataPortalResult> Fetch(Type objectType, object criteria, Data
DataPortalResult result = null;
try
{
if (isSync)
throw new NotSupportedException("isSync == true");
var client = GetClient();
var request = GetBaseCriteriaRequest();
request.TypeName = AssemblyNameTranslator.GetAssemblyQualifiedName(objectType.AssemblyQualifiedName);
Expand All @@ -259,7 +255,7 @@ public async Task<DataPortalResult> Fetch(Type objectType, object criteria, Data

var serialized = MobileFormatter.Serialize(request);

serialized = await CallDataPortalServer(client, serialized, "fetch", GetRoutingToken(objectType));
serialized = await CallDataPortalServer(client, serialized, "fetch", GetRoutingToken(objectType), isSync);

var response = (Csla.Server.Hosts.HttpChannel.HttpResponse)MobileFormatter.Deserialize(serialized);
response = ConvertResponse(response);
Expand Down Expand Up @@ -304,16 +300,14 @@ public async Task<DataPortalResult> Update(object obj, DataPortalContext context
DataPortalResult result = null;
try
{
if (isSync)
throw new NotSupportedException("isSync == true");
var client = GetClient();
var request = GetBaseUpdateCriteriaRequest();
request.ObjectData = MobileFormatter.Serialize(obj);
request = ConvertRequest(request);

var serialized = MobileFormatter.Serialize(request);

serialized = await CallDataPortalServer(client, serialized, "update", GetRoutingToken(obj.GetType()));
serialized = await CallDataPortalServer(client, serialized, "update", GetRoutingToken(obj.GetType()), isSync);

var response = (Csla.Server.Hosts.HttpChannel.HttpResponse)MobileFormatter.Deserialize(serialized);
response = ConvertResponse(response);
Expand Down Expand Up @@ -359,8 +353,6 @@ public async Task<DataPortalResult> Delete(Type objectType, object criteria, Dat
DataPortalResult result = null;
try
{
if (isSync)
throw new NotSupportedException("isSync == true");
var client = GetClient();
var request = GetBaseCriteriaRequest();
request.TypeName = AssemblyNameTranslator.GetAssemblyQualifiedName(objectType.AssemblyQualifiedName);
Expand All @@ -373,7 +365,7 @@ public async Task<DataPortalResult> Delete(Type objectType, object criteria, Dat

var serialized = MobileFormatter.Serialize(request);

serialized = await CallDataPortalServer(client, serialized, "delete", GetRoutingToken(objectType));
serialized = await CallDataPortalServer(client, serialized, "delete", GetRoutingToken(objectType), isSync);

var response = (Csla.Server.Hosts.HttpChannel.HttpResponse)MobileFormatter.Deserialize(serialized);
response = ConvertResponse(response);
Expand Down Expand Up @@ -401,6 +393,16 @@ public async Task<DataPortalResult> Delete(Type objectType, object criteria, Dat
return result;
}

private async Task<byte[]> CallDataPortalServer(HttpClient client, byte[] serialized, string operation, string routingToken, bool isSync)
{
if (isSync)
serialized = Threading.SyncTask.Run(new Func<Task<byte[]>>(
async () => await CallDataPortalServer(client, serialized, operation, routingToken)));
else
serialized = await CallDataPortalServer(client, serialized, operation, routingToken);
return serialized;
}

private async Task<byte[]> CallDataPortalServer(HttpClient client, byte[] serialized, string operation, string routingToken)
{
HttpRequestMessage httpRequest = null;
Expand Down
38 changes: 38 additions & 0 deletions Source/Csla.Shared/Threading/SyncTask.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
//-----------------------------------------------------------------------
// <copyright file="SyncTask.cs" company="Marimer LLC">
// Copyright (c) Marimer LLC. All rights reserved.
// Website: http://www.lhotka.net/cslanet/
// </copyright>
// <summary></summary>
//-----------------------------------------------------------------------
using System;
using System.Globalization;
using System.Security.Principal;
using System.Threading;
using System.Threading.Tasks;

namespace Csla.Threading
{
/// <summary>
/// Run an async operation synchronously without
/// blocking the UI thread.
/// </summary>
public static class SyncTask
{
private static readonly TaskFactory _myTaskFactory = new TaskFactory(CancellationToken.None, TaskCreationOptions.None, TaskContinuationOptions.None, TaskScheduler.Default);

/// <summary>
/// Run an async function synchronously without
/// blocking the UI thread.
/// </summary>
public static T Run<T>(Func<Task<T>> func)
{
var context = new ContextParams();
return _myTaskFactory.StartNew<Task<T>>(delegate
{
context.SetThreadContext();
return func();
}).Unwrap<T>().GetAwaiter().GetResult();
}
}
}

0 comments on commit 23904c9

Please sign in to comment.