Skip to content

Commit 7a5a0b9

Browse files
authored
Merge pull request #48 from lucaslorentz/improve-await-untyped-task
Improve await of awaitable return types
2 parents 6b8f510 + 90ce21b commit 7a5a0b9

File tree

3 files changed

+32
-29
lines changed

3 files changed

+32
-29
lines changed

src/LLL.DurableTask.Worker/Activities/MethodTaskActivity.cs

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using DurableTask.Core;
77
using DurableTask.Core.Serializing;
88
using LLL.DurableTask.Core.Serializing;
9+
using LLL.DurableTask.Worker.Utils;
910
using Newtonsoft.Json.Linq;
1011

1112
namespace LLL.DurableTask.Worker.Orchestrations;
@@ -87,21 +88,7 @@ private object[] PrepareParameters(
8788

8889
private async Task<string> SerializeResult(object result)
8990
{
90-
if (result is Task task)
91-
{
92-
if (_methodInfo.ReturnType.IsGenericType)
93-
{
94-
result = await (dynamic)task;
95-
}
96-
else
97-
{
98-
await task;
99-
result = null;
100-
}
101-
}
102-
103-
var serializedResult = _dataConverter.Serialize(result);
104-
105-
return serializedResult;
91+
var awaitedResult = await TaskUtils.MaybeAwait(result, _methodInfo.ReturnType);
92+
return _dataConverter.Serialize(awaitedResult);
10693
}
10794
}

src/LLL.DurableTask.Worker/Orchestrations/MethodTaskOrchestration.cs

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
using DurableTask.Core;
77
using DurableTask.Core.Serializing;
88
using LLL.DurableTask.Core.Serializing;
9+
using LLL.DurableTask.Worker.Utils;
910

1011
namespace LLL.DurableTask.Worker.Orchestrations;
1112

@@ -92,20 +93,9 @@ private object[] PrepareParameters(
9293

9394
private async Task<string> SerializeResult(object result)
9495
{
95-
if (result is Task task)
96-
{
97-
if (_methodInfo.ReturnType.IsGenericType)
98-
{
99-
result = await (dynamic)task;
100-
}
101-
else
102-
{
103-
await task;
104-
result = null;
105-
}
106-
}
96+
var awaitedResult = await TaskUtils.MaybeAwait(result, _methodInfo.ReturnType);
10797

108-
var serializedResult = _dataConverter.Serialize(result);
98+
var serializedResult = _dataConverter.Serialize(awaitedResult);
10999

110100
return serializedResult;
111101
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
using System;
2+
using System.Runtime.CompilerServices;
3+
using System.Threading.Tasks;
4+
5+
namespace LLL.DurableTask.Worker.Utils;
6+
7+
internal static class TaskUtils
8+
{
9+
public static async Task<object> MaybeAwait(dynamic result, Type returnType)
10+
{
11+
var getAwaiterMethod = returnType.GetMethod(nameof(Task.GetAwaiter));
12+
if (getAwaiterMethod is null)
13+
return result;
14+
15+
var getResultMethod = getAwaiterMethod.ReturnType.GetMethod(nameof(TaskAwaiter<object>.GetResult));
16+
if (getResultMethod is not null && getResultMethod.ReturnType != typeof(void))
17+
{
18+
return await result;
19+
}
20+
else
21+
{
22+
await result;
23+
return null;
24+
}
25+
}
26+
}

0 commit comments

Comments
 (0)