Skip to content

Commit 401a19e

Browse files
authored
Merge pull request #476 from AndreyG/RdTask.GetAwaiter
implement RdTask.GetAwaiter
2 parents ed4bba2 + 063066d commit 401a19e

File tree

2 files changed

+47
-2
lines changed

2 files changed

+47
-2
lines changed

rd-net/RdFramework/Tasks/RdTaskEx.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Runtime.CompilerServices;
23
using System.Threading;
34
using System.Threading.Tasks;
45
using JetBrains.Annotations;
@@ -121,5 +122,27 @@ public static Task<T> AsTask<T>(this IRdTask<T> task)
121122
});
122123
return tcs.Task;
123124
}
125+
126+
[PublicAPI]
127+
public static RdTaskAwaiter<T> GetAwaiter<T>(this IRdTask<T> task) => new(task.Result);
128+
129+
public readonly struct RdTaskAwaiter<T> : INotifyCompletion
130+
{
131+
private readonly IReadonlyProperty<RdTaskResult<T>> myResult;
132+
133+
internal RdTaskAwaiter(IReadonlyProperty<RdTaskResult<T>> result)
134+
{
135+
myResult = result;
136+
}
137+
138+
public bool IsCompleted => myResult.Maybe.HasValue;
139+
140+
public T GetResult() => myResult.Value.Unwrap();
141+
142+
public void OnCompleted(Action continuation)
143+
{
144+
myResult.Change.AdviseOnce(Lifetime.Eternal, _ => continuation());
145+
}
146+
}
124147
}
125148
}

rd-net/Test.RdFramework/AsyncRdTaskTest.cs

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,24 @@ protected override IScheduler CreateScheduler(bool isServer)
2020
}
2121

2222
[Test]
23-
public void BindableRdCallListTest()
23+
public void BindableRdCallListUseSystemTaskTest()
24+
{
25+
BindableRdCallListTest(TaskKind.System);
26+
}
27+
28+
[Test]
29+
public void BindableRdCallListUseRdTaskTest()
30+
{
31+
BindableRdCallListTest(TaskKind.Rd);
32+
}
33+
34+
private enum TaskKind
35+
{
36+
System,
37+
Rd,
38+
}
39+
40+
private void BindableRdCallListTest(TaskKind taskKind)
2441
{
2542
ClientWire.AutoTransmitMode = true;
2643
ServerWire.AutoTransmitMode = true;
@@ -52,7 +69,12 @@ public void BindableRdCallListTest()
5269
{
5370
BindToClient(lifetime, callsite, entity_id);
5471

55-
var list = await callsite.Start(lifetime, Unit.Instance).AsTask();
72+
var list = taskKind switch
73+
{
74+
TaskKind.System => await callsite.Start(lifetime, Unit.Instance).AsTask(),
75+
TaskKind.Rd => await callsite.Start(lifetime, Unit.Instance),
76+
_ => throw new ArgumentOutOfRangeException(nameof(taskKind), taskKind, null)
77+
};
5678
var count = 0;
5779

5880
list.View(lifetime, (lt, index, value) =>

0 commit comments

Comments
 (0)